Arquivos
pipe-viewer/lib/WWW/PipeViewer/Authentication.pm
T
2020-11-27 01:14:35 +02:00

217 linhas
5.6 KiB
Perl

package WWW::PipeViewer::Authentication;
use utf8;
use 5.014;
use warnings;
=head1 NAME
WWW::PipeViewer::Authentication - OAuth login support.
=head1 SYNOPSIS
use WWW::PipeViewer;
my $hash_ref = WWW::PipeViewer->oauth_login($code);
=head1 SUBROUTINES/METHODS
=cut
sub _get_token_oauth_url {
my ($self) = @_;
return $self->get_oauth_url() . 'token';
}
=head2 oauth_refresh_token()
Refresh the access_token using the refresh_token. Returns a HASH ref with the `access_token` or undef.
=cut
sub oauth_refresh_token {
my ($self) = @_;
my $json_data = $self->lwp_post(
$self->_get_token_oauth_url(),
[Content => $self->get_www_content_type,
client_id => $self->get_client_id() // return,
client_secret => $self->get_client_secret() // return,
refresh_token => $self->get_refresh_token() // return,
grant_type => 'refresh_token',
]
);
return $self->parse_json_string($json_data);
}
=head2 get_accounts_oauth_url()
Creates an OAuth URL with the 'code' response type. (Google's authorization server)
=cut
sub get_accounts_oauth_url {
my ($self) = @_;
my $url = $self->_append_url_args(
($self->get_oauth_url() . 'auth'),
response_type => 'code',
client_id => $self->get_client_id() // return,
redirect_uri => $self->get_redirect_uri() // return,
scope => 'https://www.googleapis.com/auth/youtube.force-ssl',
access_type => 'offline',
);
return $url;
}
=head2 oauth_login($code)
Returns a HASH ref with the access_token, refresh_token and some other info.
The $code can be obtained by going to the URL returned by the C<get_accounts_oauth_url()> method.
=cut
sub oauth_login {
my ($self, $code) = @_;
length($code) < 20 and return;
my $json_data = $self->lwp_post(
$self->_get_token_oauth_url(),
[Content => $self->get_www_content_type,
client_id => $self->get_client_id() // return,
client_secret => $self->get_client_secret() // return,
redirect_uri => $self->get_redirect_uri() // return,
grant_type => 'authorization_code',
code => $code,
]
);
return $self->parse_json_string($json_data);
}
sub __AUTH_EOL__() { "\0\0\0" }
=head2 load_authentication_tokens()
Will try to load the access and refresh tokens from I<authentication_file>.
=cut
sub load_authentication_tokens {
my ($self) = @_;
if (defined $self->get_access_token and defined $self->get_refresh_token) {
return 1;
}
my $file = $self->get_authentication_file() // return;
my $key = $self->get_key() // return;
if (-f $file) {
local $/ = __AUTH_EOL__;
open my $fh, '<:raw', $file or return;
my @tokens;
foreach my $i (0 .. 1) {
chomp(my $token = <$fh>);
$token =~ /\S/ || last;
push @tokens, $self->decode_token($token);
}
$self->set_access_token($tokens[0]) // return;
$self->set_refresh_token($tokens[1]) // return;
close $fh;
return 1;
}
return;
}
=head2 encode_token($token)
Encode the token with the I<key> and return it.
=cut
sub encode_token {
my ($self, $token) = @_;
if (defined(my $key = $self->get_key)) {
require MIME::Base64;
return MIME::Base64::encode_base64($token ^ substr($key, -length($token)));
}
return;
}
=head2 decode_token($token)
Decode the token with the I<key> and return it.
=cut
sub decode_token {
my ($self, $token) = @_;
if (defined(my $key = $self->get_key)) {
require MIME::Base64;
my $bin = MIME::Base64::decode_base64($token);
return $bin ^ substr($key, -length($bin));
}
return;
}
=head2 save_authentication_tokens()
Encode and save the access and refresh into the I<authentication_file>.
=cut
sub save_authentication_tokens {
my ($self) = @_;
my $file = $self->get_authentication_file() // return;
my $access_token = $self->get_access_token() // return;
my $refresh_token = $self->get_refresh_token() // return;
if (open my $fh, '>:raw', $file) {
foreach my $token ($access_token, $refresh_token) {
print {$fh} $self->encode_token($token) . __AUTH_EOL__;
}
close $fh;
return 1;
}
return;
}
=head1 AUTHOR
Trizen, C<< <echo dHJpemVuQHByb3Rvbm1haWwuY29tCg== | base64 -d> >>
=head1 SUPPORT
You can find documentation for this module with the perldoc command.
perldoc WWW::PipeViewer::Authentication
=head1 LICENSE AND COPYRIGHT
Copyright 2013-2015 Trizen.
This program is free software; you can redistribute it and/or modify it
under the terms of either: the GNU General Public License as published
by the Free Software Foundation; or the Artistic License.
See L<http://dev.perl.org/licenses/> for more information.
=cut
1; # End of WWW::PipeViewer::Authentication