163 lines
3.1 KiB
Perl
163 lines
3.1 KiB
Perl
=encoding utf-8
|
|
|
|
=head1 NAME
|
|
|
|
Yandex::OAuth - module for get access token to Yandex.API
|
|
|
|
=head1 SYNOPSIS
|
|
|
|
use Yandex::OAuth;
|
|
|
|
my $oauth = Yandex::OAuth->new(
|
|
client_id => '76df1cf****************fb31d0289',
|
|
client_secret => 'e3a2855****************4de3c2afc',
|
|
);
|
|
|
|
# return link for open in browser
|
|
say $oauth->get_code();
|
|
|
|
# return JSON with access_token
|
|
say Dumper $oauth->get_token( code => 3557461 );
|
|
|
|
# return JSON with access_token
|
|
say Dumper $oauth->refresh_token( refresh_token => 3557461 );
|
|
|
|
=head1 DESCRIPTION
|
|
|
|
Yandex::OAuth is a module for get access token for Yandex.API
|
|
See more at https://tech.yandex.ru/oauth/doc/dg/concepts/ya-oauth-intro-docpage/
|
|
|
|
|
|
=cut
|
|
|
|
package Yandex::OAuth;
|
|
use 5.008001;
|
|
use utf8;
|
|
use Modern::Perl;
|
|
use JSON::XS;
|
|
use URI::Escape;
|
|
|
|
use LWP::UserAgent;
|
|
|
|
use Moo;
|
|
|
|
our $VERSION = "0.07";
|
|
|
|
has 'ua' => (
|
|
is => 'ro',
|
|
default => sub {
|
|
my $ua = LWP::UserAgent->new();
|
|
$ua->agent( 'Yandex::OAuth Perl API Client' );
|
|
$ua->timeout( 120 );
|
|
return $ua;
|
|
}
|
|
);
|
|
|
|
has 'auth_url' => (
|
|
is => 'ro',
|
|
default => 'https://oauth.yandex.ru/authorize',
|
|
|
|
);
|
|
|
|
has 'token_url' => (
|
|
is => 'ro',
|
|
default => 'https://oauth.yandex.ru/token',
|
|
);
|
|
|
|
has 'client_id' => (
|
|
is => 'rw',
|
|
required => 1,
|
|
);
|
|
|
|
has 'client_secret' => (
|
|
is => 'rw',
|
|
required => 1,
|
|
);
|
|
|
|
has 'demo' => (
|
|
is => 'rw'
|
|
);
|
|
|
|
=head1 METHODS
|
|
|
|
=over
|
|
|
|
=item B<get_code()>
|
|
|
|
return a link for open in browser
|
|
|
|
$oauth->get_code();
|
|
|
|
=cut
|
|
|
|
sub get_code {
|
|
my ( $self, %params ) = @_;
|
|
|
|
return $self->auth_url . "?response_type=code&client_id=".$self->client_id .
|
|
( ( defined $params{state} ) ? "&state=" . uri_escape( $params{state} ) : '' );
|
|
}
|
|
|
|
=item B<get_token()>
|
|
|
|
return a json with access_token or error if code has expired
|
|
|
|
$oauth->get_token( code => XXXXXX );
|
|
|
|
=cut
|
|
|
|
sub get_token {
|
|
my ( $self, %params ) = @_;
|
|
|
|
return JSON::XS::decode_json( $self->demo ) if $self->demo;
|
|
|
|
my $res = $self->ua->post($self->token_url, {
|
|
code => $params{code},
|
|
client_id => $self->client_id,
|
|
client_secret => $self->client_secret,
|
|
grant_type => 'authorization_code',
|
|
});
|
|
|
|
return JSON::XS::decode_json( $res->content );
|
|
}
|
|
|
|
=item B<refresh_token()>
|
|
|
|
return a json with access_token or error if refresh_token has already been used
|
|
|
|
$oauth->refresh_token( refresh_token => XXXXXX );
|
|
|
|
=cut
|
|
|
|
sub refresh_token {
|
|
my ( $self, %params ) = @_;
|
|
|
|
return JSON::XS::decode_json( $self->demo ) if $self->demo;
|
|
|
|
my $res = $self->ua->post($self->token_url, {
|
|
refresh_token => $params{refresh_token},
|
|
client_id => $self->client_id,
|
|
client_secret => $self->client_secret,
|
|
grant_type => 'refresh_token',
|
|
});
|
|
|
|
return JSON::XS::decode_json( $res->content );
|
|
}
|
|
|
|
1;
|
|
|
|
__END__
|
|
=back
|
|
|
|
=head1 LICENSE
|
|
|
|
Copyright (C) Andrey Kuzmin.
|
|
|
|
This library is free software; you can redistribute it and/or modify
|
|
it under the same terms as Perl itself.
|
|
|
|
=head1 AUTHOR
|
|
|
|
Andrey Kuzmin E<lt>chipsoid@cpan.orgE<gt>
|
|
|
|
=cut
|