API-Google
view release on metacpan or search on metacpan
lib/API/Google/Server.pm view on Meta::CPAN
#!perl
package API::Google::Server;
$API::Google::Server::VERSION = '0.12';
# ABSTRACT: Mojolicious::Lite web server for getting Google API tokens via Oauth 2.0
use Mojolicious::Lite;
use Data::Dumper;
use Config::JSON;
use Tie::File;
use Crypt::JWT qw(decode_jwt);
use feature 'say';
use Mojo::Util 'getopt';
use Mojolicious::Plugin::OAuth2;
# use Mojo::JWT;
# sub return_json_filename {
# use Cwd;
# my $cwd = getcwd;
# opendir my $dir, $cwd or die "Cannot open directory: $!";
# my @files = readdir $dir;
# my @j = grep { $_ =~ /\w+.json/ } @files;
# return $j[0];
# }
# my $f = return_json_filename();
my $config = Config::JSON->new($ENV{'GOAUTH_TOKENSFILE'});
delete $ENV{'GOAUTH_TOKENSFILE'};
# authorize_url and token_url can be retrieved from OAuth discovery document
# https://github.com/marcusramberg/Mojolicious-Plugin-OAuth2/issues/52
plugin "OAuth2" => {
google => {
key => $config->get('gapi/client_id'), # $config->{gapi}{client_id},
secret => $config->get('gapi/client_secret'), #$config->{gapi}{client_secret},
authorize_url => 'https://accounts.google.com/o/oauth2/v2/auth?response_type=code',
token_url => 'https://www.googleapis.com/oauth2/v4/token'
}
};
helper get_new_tokens => sub {
my ($c,$auth_code) = @_;
my $hash = {};
$hash->{code} = $c->param('code');
$hash->{redirect_uri} = $c->url_for->to_abs->to_string;
$hash->{client_id} = $config->get('gapi/client_id');
$hash->{client_secret} = $config->get('gapi/client_secret');
$hash->{grant_type} = 'authorization_code';
my $tokens = $c->ua->post('https://www.googleapis.com/oauth2/v4/token' => form => $hash)->res->json;
return $tokens;
};
# =method get_all_google_jwk_keys
# Get all Google JWK keys for validation of JSON Web Token
# Check https://jwt.io/ and https://developers.google.com/identity/protocols/OpenIDConnect#validatinganidtoken for more details
# return arrayref
# =cut
# helper get_all_google_jwk_keys => sub {
# my $c = shift;
# my $certs = $c->ua->get('https://www.googleapis.com/oauth2/v3/certs')->res->json;
# # return $certs;
# my @keys = @{$certs->{keys}};
# return \@keys;
# # return $certs->{keys}[1];
# };
# =method get_google_jwk_key_by_kid
# Return JWK key with specified kid
# $c->get_google_cert_by_kid($kid,$crts) # $kid - string, $crts - arrayref
# Example of usage:
# $c->get_google_cert_by_kid($header->{kid},$crts)
# =cut
# helper get_google_jwk_key_by_kid => sub {
# my ($c, $kid, $jwks_arrayref) = @_;
# if (!defined $jwks_arrayref) {
# warn 'get_google_cert_by_kid(): $ctrs is not defined, obtaining from Google...';
# $jwks_arrayref = $c->ua->get('https://www.googleapis.com/oauth2/v3/certs')->res->json->{keys};
# }
# # my @keys = @{$crts->{keys}};
# my @keys = @$jwks_arrayref;
# my $size = scalar @keys;
# warn "Found $size JWK keys";
# if (!defined $kid) {
# warn 'get_google_cert_by_kid(): $kid is not defined, will return random certificate';
# return $keys[rand @keys];
# } else {
# for (@keys) {
# if ($_->{kid} eq $kid) {
# return $_;
# }
# }
# }
( run in 0.733 second using v1.01-cache-2.11-cpan-39bf76dae61 )