Skip to content

Instantly share code, notes, and snippets.

@nikita-d
Created May 27, 2014 10:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nikita-d/831ca086a19e5fa538f6 to your computer and use it in GitHub Desktop.
Save nikita-d/831ca086a19e5fa538f6 to your computer and use it in GitHub Desktop.
$app->helper(
'check_authentication' => sub {
my $c = shift;
my $cb = pop;
my $session_id = shift;
die 'no session id' unless defined $session_id && $session_id;
my $redis = $c->redis_session;
my $log = $c->app->log;
if (defined $session_id && $session_id) {
Mojo::IOLoop->delay(
sub {
$redis->hgetall($c->session_key($session_id) => shift->begin);
},
sub {
my ($delay, $session) = @_;
return $c->$cb($session, undef, undef) unless (defined $session && scalar keys %$session != 0);
$delay->begin(0)->($session);
my $session_expires = $session->{'expires'};
$redis->expireat($c->session_key($session_id) => $session_expires => $delay->begin);
},
sub {
my ($delay, $session, $ok) = @_;
$c->app->log->debug(p \@_);
return $c->$cb($session_id, undef, undef) unless defined $session && $session;
my $session_data = $c->json_decode($session->{'data'});
my $session_expires = $session->{'expires'};
$session_data->{'user'} = $c->schema->thaw($session_data->{'user'});
return $c->$cb($session_id, $session_expires, $session_data);
});
} else {
return $c->$cb();
}
});
$app->helper(
'authenticate' => sub {
my $c = shift->render_later;
my $cb = pop;
my ($username, $password) = @_;
my $salt = $c->app->salt;
my $redis = $c->redis_session;
$cb ||= sub { return shift };
if (my $user = $c->staff_try_authenticate($username, $password, $salt)) {
my $session_id = $c->generate_session_id();
my $session_data = {
user => $c->schema->freeze($user),
uid => $user->id
};
my $session_expires = 30;
my $key = $c->session_key($session_id);
$c->app->log->debug(sprintf("authentication successfull: %s", $username));
$c->app->log->debug(sprintf("loaded user: %s", p $user));
Mojo::IOLoop->delay(
sub {
my $delay = shift;
my $session = {
'sid' => $session_id,
'data' => $c->json_encode($session_data),
'expires' => time + $session_expires
};
$redis->hmset($key => $session => $delay->begin);
$redis->expireat($key => time + $session_expires);
$delay->begin(0)->($session);
},
sub {
my ($delay, $result, $session) = @_;
$c->stash('current_user' => $user);
$c->$cb($session_id, $session->{'expires'}, $user);
});
} else {
$c->app->log->debug("authentication failed: $username");
$c->$cb->(undef);
}
}
);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment