Matt S Trout wrote:
On Mon, Jun 04, 2007 at 11:44:50AM -0400, Jim Spath wrote:
Is there any way to disable the validation of session ids? Seems like it would be a somewhat useful option for those cases (like interfacing with Facebook), where the session ids are pre-created.

sub validate_session_id { 1 }

might work. But don't blame me if it breaks something :)

I have a working Facebook state plugin now. It overrides get_session_id, generate_session_id, and validate_session_id.

One gotcha I found was that since Facebook always passes a session key with its users, my get_session_id() was always returning a session key. This was a problem when I needed to log users in a create a new session, because Catalyst was behaving as if it already had a session, and wouldn't create a new one.

My solution was to use a hidden field on Facebook logins called fcbk_login. get_session_id() checks for this request parameter, and if it is present, will not return the Facebook session key. I don't really like this solution as it requires a particular parameter to be in the login form template, but I couldn't think of a better way to deal with it.

Here's the module in its current state, feedback would be welcome...

====
package Catalyst::Plugin::Session::State::FcbkToken;

use base qw/Catalyst::Plugin::Session::State/;

use strict;
use warnings;

use NEXT;

our $VERSION = "0.01";

sub get_session_id {
  my ($c) = @_;

  # get facebook session id from parameter unless user is
  # trying to login

  if (!$c->request->param('fcbk_login') &&
      (my $sid = $c->request->param('fb_sig_session_key'))) {

    # indicates that we used a facebook session key
    $c->stash->{'fcbk_token_found'} = 1;

    $c->log->debug(qq/Found facebook session key "$sid"/) if $c->debug;

    return $sid;

  }

  $c->NEXT::get_session_id(@_);
}

sub validate_session_id {
  my ($c, $sid) = @_;

  # properly validate facebook session ids
  if ($c->stash->{'fcbk_token_found'}) {
    return $sid && $sid =~ /^[-a-f\d]+$/i;
  }

  $c->NEXT::validate_session_id(@_);
}

sub generate_session_id {
  my ($c) = @_;

  if (my $sid = $c->request->param('fb_sig_session_key')) {

    $c->log->debug(qq/Created sessionid using facebook session key "$sid"/)
      if $c->debug;

    return $sid;

  }
  $c->NEXT::generate_session_id(@_);
}

1;
====

Thanks for the help everyone!

- Jim

_______________________________________________
List: [email protected]
Listinfo: http://lists.rawmode.org/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/[email protected]/
Dev site: http://dev.catalyst.perl.org/

Reply via email to