Credential::MultiFactor

ajouté le 18.02.2012 dans Catalyst • par SwissTenguCommentaires (0)
Tags: yubico sécurité otp multifactor credential

Dans un précédent post, j'avais mentionné que ce blog employant une authentification basée sur trois clefs, dont un OTP. Malheureusement, après 2-3 tests, il s'est avéré que seul la yubikey était prise en compte. Ce qui n'est évidemment pas des plus sécure.

Après quelques recherches, je me suis rendu compte que Catalyst ne possède pas de plugin MultiFactor pour l'authentification...

Bin maintenant, c'est fait, il y en a un!

Et comme j'aime bien les choses bien faites, il n'est pas que pour les yubikeys, mais permet au contraire de mettre ce que l'ont veut dedans. Voici le code du module:

Code: perl
package Catalyst::Authentication::Credential::MultiFactor;

use strict;
use warnings;

use Moose;

has config => (is => 'ro', required => 1);
has factors => (is => 'ro', default => sub { [] });

sub BUILDARGS {
  my ($class, $config, $app, $realm) = @_;
  { config => $config, app => $app, realm => $realm };
}

sub BUILD {
  my ($self, $args) = @_;

  my ($app, $realm) = @{$args}{qw(app realm)};

  foreach my $factor (@{$self->config->{'factors'}}) {

    my $credential_class  = $factor->{'class'};
   
    if ($credential_class !~ /^\+(.*)$/ ) {
      $credential_class = "Catalyst::Authentication::Credential::${credential_class}";
    } else {
      $credential_class = $1;
    }
   
    Catalyst::Utils::ensure_class_loaded( $credential_class );
   
    $app->log->debug('LOADED class: '.$credential_class) if $app->debug;
    push @{$self->factors}, $credential_class->new($factor, $app, $realm);

  }
}

sub authenticate {
  my ($self, $c, $realm, $authinfo) = @_;

  my $user_obj;

  foreach my $factor (@{$self->factors}) {
    $c->log->debug('Trying to authenticate agains '.$factor) if $c->debug;
    return unless eval { $user_obj = $factor->authenticate($c, $realm, $authinfo) };
    $c->log->debug('Authentication successful against '.$factor) if $c->debug;
  }
  return $user_obj;
}

1;


C'est, en somme, assez simple. La configuration permettant d'employer ce plugin doit avoir cette forme:
Code: perl
__PACKAGE__->config(
...
        credential => {
          class => 'MultiFactor',
          factors  => [
            {
              class        => 'YubiKey',
              api_id       => 1337,
              api_key      => 'fOo/BarbAz/=',
              id_for_store => '<yubikey field name>',
            },
            {
              class         => 'Password',
              user_model    => 'DB::user',
              password_type => 'self_check',
            }
          ],
        },
...
);


Je ne pense pas avoir grand chose de plus à dire.. Ce plugin permet d'employer n'importe quel autre plugin disponible dans Catalyst, voire en dehors de Catalyst puisqu'il permet de charger n'importe quel classe.

Vous pouvez très bien associer une YubiKey avec le système de Google, voire Twitter, Facebook etc.
De quoi offrir une panoplie complète, la seule limite est votre imagination.
Il permet aussi d'être surchargé, étendu, supporte 1-n systèmes d'authentification...

Enjoy!

T.