CatalystX-OAuth2
view release on metacpan or search on metacpan
lib/Catalyst/Authentication/Credential/OAuth2.pm view on Meta::CPAN
package Catalyst::Authentication::Credential::OAuth2;
use Moose;
use MooseX::Types::Common::String qw(NonEmptySimpleStr);
use LWP::UserAgent;
use HTTP::Request::Common;
use JSON::Any;
use Moose::Util;
# ABSTRACT: Authenticate against OAuth2 servers
has [qw(grant_uri token_uri client_id)] => (
is => 'ro',
isa => NonEmptySimpleStr,
required => 1,
);
has token_uri_method => (is=>'ro', required=>1, default=>'GET');
has token_uri_post_content_type => (is=>'ro', required=>1, default=>'application/x-www-form-urlencoded');
has extra_find_user_token_fields => (is=>'ro', required=>0, predicate=>'has_extra_find_user_token_fields');
has scope => (is=>'ro', required=>0, predicate=>'has_scope');
has audience => (is=>'ro', required=>0, predicate=>'has_audience');
has response_type => (is=>'ro', required=>1, default=>'code');
has client_secret => (
is => 'ro',
isa => NonEmptySimpleStr,
required => 0,
predicate => 'has_client_secret'
);
has ua => ( is => 'ro', default => sub { LWP::UserAgent->new } );
sub BUILDARGS {
my ( $class, $config, $app, $realm ) = @_;
Moose::Util::ensure_all_roles( $realm, 'CatalystX::OAuth2::ClientInjector' );
Moose::Util::ensure_all_roles( $realm->store, 'CatalystX::OAuth2::ClientPersistor');
return $config;
}
sub authenticate {
my ( $self, $ctx, $realm, $auth_info ) = @_;
my $callback_uri = $self->_build_callback_uri($ctx);
unless ( defined( my $code = $ctx->request->params->{code} ) ) {
my $auth_url = $self->extend_permissions( $callback_uri, $auth_info );
$ctx->response->redirect($auth_url);
return;
} else {
my $token =
$self->request_access_token( $callback_uri, $code, $auth_info );
die 'Error validating verification code' unless $token;
my %find_user_fields = (token => $token->{access_token});
if($self->has_extra_find_user_token_fields) {
$find_user_fields{$_} = $token->{$_} for @{$self->extra_find_user_token_fields};
}
return $realm->find_user( \%find_user_fields, $ctx );
}
}
sub _build_callback_uri {
my ( $self, $ctx ) = @_;
my $uri = $ctx->request->uri->clone;
( run in 1.314 second using v1.01-cache-2.11-cpan-75ffa21a3d4 )