NAME

Jedi::Plugin::Auth - Auth for Jedi

VERSION

version 0.01

DESCRIPTION

Auth for Jedi is a package that handle authentication storage for you.

You can signin, login, logout, signout and get the list of user.

You can also store additional information.

All user have a login and password, and get a unique user id (UUID) at the creation.

You can use that UUID in your database to keep the list of action an user have made.

SYNOPSIS

package MyApps;
use Data::UUID;
use Jedi::Apps;
use Jedi::Plugin::Template;
use Jedi::Plugin::Session; #mandatory for the Auth
use Jedi::Plugin::Auth;

sub jedi_apps {
  my ($app) = @_;

  $app->get('/login', $app->can('handle_login'));
  $app->get('/signin', $app->can('handle_signin'));
  $app->get('/activate', $app->can('handle_activate'));

}

sub handle_login {
  my ($app, $request, $response) = @_;

  my ($login, $password) = map { $request->params->{$_} } qw/user password/;

  my $user = $app->jedi_auth_login($request, user => $user, password => $password);

  if ($user->{status} eq 'ok') {
    #redirect to index
    $response->status('302');
    $response->set_header('Location' => '/');
    return 0; #stop propagation
  } else {
    $response->status('200');
    $response->body($app->template('index'), {error_msg => 'bad login'});
  }
}

sub handle_signin {
  my ($app, $request, $response) = @_;
  my ($login, $password, $email, $roles) = map { $request->params->{$_} } qw/user password email roles/;

  my $user = $app->jedi_auth_signin(
    user => $login,
    password => $password, #auto sha1
    roles => [split /,/, $roles // ''],
    info => {
      email => $email,
      activated => 0,
      activate_token => Data::UUID->new->create_str;
    }
  );

  if ($user->{status} eq 'ok') {
    #please activate your account by mail
  } else {
    #display error
    # $user->{missing} if a field is missing
    # $user->{error_msg} for DB error, you can check 'user is not uniq' or stuff like that
  }

}

sub handle_activate {
  my ($app, $request, $response) = @_;
  my ($user, $activate_token) = map { $request->params->{$_} } qw/user token/;

  my $users = $app->jedi_auth_users($user);
  my $user = shift @$users;
  if (!defined $user) {
    # user not found
  } else {
    if ($user->{info}{activate_token} eq $activate_token) {
      # activate
      $app->jedi_auth_update($request, user => $user, info => {activate_token => undef, activated => 0});
      # display ok
    } else {
      # display error
    }
  }

}

METHODS

jedi_auth_signin

Create a new user

$app->jedi_auth_signin(
   user     => 'admin',
   password => 'admin',
   uuid     => 'XXXXXXXXXXXXXXX' #SHA1 Hex Base64
   roles    => ['admin'],
   info     => {
     activated => 0,
     label     => 'Administrator',
     email     => 'admin@admin.local',
     blog      => 'http://blog.celogeek.com',
     live      => 'geistteufel@live.fr',
     created_at => 1388163353,
     last_login => 1388164353,
   }
);

Roles are dynamically added. Your apps need to handle the relation between each role.

For example : admin include poweruser, user ...

Return :

{
  status => 'ok',
  user => 'admin',
  uuid => Data::UUID string,
  info => {
    activated => 0,
    label     => 'Administrator',
    email     => 'admin@admin.local',
    blog      => 'http://blog.celogeek.com',
    live      => 'geistteufel@live.fr',
    created_at => 1388163353,
    last_login => 1388164353,
  },
  roles => ['admin'],
}

In case of missing fields :

{
  status => 'ko',
  missing => ['list of missing fields'],
}

For db errors (duplicate ...) :

{
  status => 'ko',
  error_msg => "$@",
}

jedi_auth_signout

Destroy an user

$app->jedi_auth_signout('admin')

If you want to destroy the current user, ensure to logout first

if ($request->session_get->{auth}{user} eq 'admin') {
  $app->jedi_auth_logout($request);
}
$app->jedi_auth_signout('admin')

jedi_auth_login

Login the user

$app->jedi_auth_login(
  $request,
  user     => 'admin',
  password => 'admin',
);

Return :

{ status => 'ok', uuid => "uuid string", info => { INFO HASH }, roles => [ ROLES ] }

{ status => 'ko' }

The user info will be save in the session of user :

$request->session_get->{auth} = {
  user => 'admin',
  uuid => Data::UUID string,
  info => {
    activated => 0,
    label     => 'Administrator',
    email     => 'admin@admin.local',
    blog      => 'http://blog.celogeek.com',
    live      => 'geistteufel@live.fr',
    created_at => 1388163353,
    last_login => 1388164353,
  },
  roles => ['admin'],
}

jedi_auth_logout

Logout the current login user

$app->jedi_auth_logout($request)

jedi_auth_update

Update the user account

$app->jedi_auth_update(
  $request,
  user => 'admin',
  info => {
    activated => 1,
  }
)

It will update the 'admin' user, and add/change the info.activated to 1. All the other info will be keep.

To clear an info key :

$app->jedi_auth_update(
  $request,
  user => 'admin',
  info => {
    blog => undef,
  }
)

jedi_auth_users_with_role

Return the list of user with a specific role.

Only the "user" key is returned

$app->jedi_auth_users_with_role('admin');

# ["admin"]

jedi_auth_users_count

Return the number of users in the databases

$app->jedi_auth_users_count()

# 1

jedi_auth_users

Return the list of all users with info :

$app->jedi_auth_users

Return only the info of the user admin :

$app->jedi_auth_users('admin')

Return the info of user admin and test :

$app->jedi_auth_users('admin', 'test')

CONFIGURATION

By default the plugin will store a SQLite DB file into the dist_dir of the Jedi::Plugin::Auth. It will use the classname of your apps to store the database only for your app.

You can change the root of the storage for your app like this in the configuration of Jedi::Launcher :

MyApps:
  auth:
    sqlite:
      path: /var/lib/auth/

BUGS

Please report any bugs or feature requests on the bugtracker website https://github.com/celogeek/perl-jedi-plugin-auth/issues

When submitting a bug or request, please include a test-file or a patch to an existing test-file that illustrates the bug or desired feature.

AUTHOR

celogeek <me@celogeek.com>

COPYRIGHT AND LICENSE

This software is copyright (c) 2013 by celogeek <me@celogeek.com>.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.