aboutsummaryrefslogtreecommitdiffstats
path: root/lib/WWW/FairViewer/Authentication.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/WWW/FairViewer/Authentication.pm')
-rw-r--r--lib/WWW/FairViewer/Authentication.pm216
1 files changed, 216 insertions, 0 deletions
diff --git a/lib/WWW/FairViewer/Authentication.pm b/lib/WWW/FairViewer/Authentication.pm
new file mode 100644
index 0000000..4994f27
--- /dev/null
+++ b/lib/WWW/FairViewer/Authentication.pm
@@ -0,0 +1,216 @@
+package WWW::FairViewer::Authentication;
+
+use utf8;
+use 5.014;
+use warnings;
+
+=head1 NAME
+
+WWW::FairViewer::Authentication - OAuth login support.
+
+=head1 SYNOPSIS
+
+ use WWW::FairViewer;
+ my $hash_ref = WWW::FairViewer->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::FairViewer::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::FairViewer::Authentication