LWP-Authen-OAuth2
view release on metacpan or search on metacpan
lib/LWP/Authen/OAuth2/ServiceProvider.pm view on Meta::CPAN
package LWP::Authen::OAuth2::ServiceProvider;
# ABSTRACT: ServiceProvider base class
our $VERSION = '0.20'; # VERSION
use 5.006;
use strict;
use warnings;
use Carp qw(confess croak);
use JSON qw(decode_json);
use Memoize qw(memoize);
use Module::Load qw(load);
use URI;
our @CARP_NOT = qw(LWP::Authen::OAuth2 LWP::Authen::OAuth2::Args);
use LWP::Authen::OAuth2::Args qw(
extract_option copy_option assert_options_empty
);
# Construct a new object.
sub new {
my ($class, $opts) = @_;
# I start as an empty hashref.
my $self = {};
# But what class am I supposed to actually be?
if (not exists $opts->{service_provider}) {
bless $self, $class;
}
else {
# Convert "Google" to "LWP::Authen::OAuth2::ServiceProvider::Google"
# Not a method because no object yet exists.
$class = service_provider_class(delete $opts->{service_provider});
my $client_type = delete $opts->{client_type};
if (not defined($client_type)) {
$client_type = "default";
}
bless $self, $class->client_type_class($client_type);
}
$self->init($opts);
}
sub init {
my ($self, $opts) = @_;
# Now let us consume options. 2 args = required, 3 = defaulted.
# In general subclasses should Just Work.
# need to read this first, since the later opts depend on it
$self->copy_option($opts, 'use_test_urls') if defined $opts->{use_test_urls};
# These are required, NOT provided by this class, but are by subclasses.
for my $field (qw(token_endpoint authorization_endpoint)) {
if ($self->can($field)) {
$self->copy_option($opts, $field, $self->$field);
}
else {
$self->copy_option($opts, $field);
}
}
# These are defaulted by this class, maybe overridden by subclasses.
for my $field (
qw(required_init optional_init),
map {
("$_\_required_params", "$_\_optional_params")
} qw(authorization request refresh)
) {
$self->copy_option($opts, $field, [$self->$field]);
}
# And hashrefs for default key/value pairs.
for my $field (
map "$_\_default_params", qw(authorization request refresh)
) {
$self->copy_option($opts, $field, {$self->$field});
}
return $self;
}
sub authorization_url {
my ($self, $oauth2, @rest) = @_;
my $param
= $self->collect_action_params("authorization", $oauth2, @rest);
my $uri = URI->new($self->authorization_endpoint());
$uri->query_form(%$param);
return $uri->as_string;
}
sub request_tokens {
my ($self, $oauth2, @rest) = @_;
my $param = $self->collect_action_params("request", $oauth2, @rest);
my $response = $self->post_to_token_endpoint($oauth2, $param);
return $self->construct_tokens($oauth2, $response);
}
sub can_refresh_tokens {
my ($self, $oauth2, %opt) = @_;
my %default = $self->refresh_default_params;
my $oauth2_args = $oauth2->for_service_provider;
for my $param ($self->refresh_required_params) {
if ( exists $default{$param}
or exists $oauth2_args->{$param}
or exists $opt{$param}
) {
( run in 2.255 seconds using v1.01-cache-2.11-cpan-0bb4e1dffa6 )