223 lines
4.7 KiB
Perl
223 lines
4.7 KiB
Perl
package Oauth2;
|
|
|
|
use strict;
|
|
use warnings;
|
|
use v5.22;
|
|
use feature qw(signatures);
|
|
no warnings qw(experimental::signatures);
|
|
use Moo;
|
|
|
|
use utf8;
|
|
use LWP::Authen::OAuth2;
|
|
use DDP;
|
|
use Mojo::JSON qw(decode_json);
|
|
use Mojo::Pg;
|
|
use SQL::Abstract;
|
|
use POSIX qw(strftime);
|
|
use HTML::Strip;
|
|
use Encoding::FixLatin qw(fix_latin);
|
|
|
|
has 'db' => (
|
|
is => 'rw',
|
|
lazy => 1,
|
|
builder => '_build_db',
|
|
);
|
|
|
|
has 'db_user' => (
|
|
is => 'rw',
|
|
default => 'db_master',
|
|
);
|
|
|
|
has 'db_pass' => (
|
|
is => 'rw',
|
|
default => 'LTL%9O9^Wj&jmX4lEg',
|
|
);
|
|
|
|
has 'db_uri' => (
|
|
is => 'rw',
|
|
default => 'nehantic-dev.cnxhiwukntah.us-east-1.rds.amazonaws.com',
|
|
);
|
|
|
|
has 'db_name' => (
|
|
is => 'rw',
|
|
default => 'nehantic_data',
|
|
);
|
|
|
|
has 'authorization_endpoint' => (
|
|
is => 'rw',
|
|
required => 1,
|
|
);
|
|
|
|
has 'token_endpoint' => (
|
|
is => 'rw',
|
|
required => 1,
|
|
);
|
|
|
|
#has 'api_endpoint' => (
|
|
# is => 'rw',
|
|
# required => 1,
|
|
#);
|
|
|
|
has 'grant_type' => (
|
|
is => 'rw',
|
|
required => 1,
|
|
);
|
|
|
|
has 'client_id' => (
|
|
is => 'rw',
|
|
required => 1,
|
|
);
|
|
|
|
has 'client_secret' => (
|
|
is => 'rw',
|
|
required => 1,
|
|
);
|
|
|
|
has 'redirect_uri' => (
|
|
is => 'rw',
|
|
required => 1,
|
|
);
|
|
|
|
has 'scope' => (
|
|
is => 'rw',
|
|
required => 0,
|
|
);
|
|
|
|
has 'user' => (
|
|
is => 'rw',
|
|
required => 1,
|
|
);
|
|
|
|
has 'token' => (
|
|
is => 'rw',
|
|
lazy => 1,
|
|
builder => '_build_token',
|
|
);
|
|
|
|
has 'code' => (
|
|
is => 'ro'
|
|
);
|
|
|
|
has 'refresh_token' => (
|
|
is => 'rw',
|
|
lazy => 1,
|
|
builder => '_build_refresh_token',
|
|
);
|
|
|
|
has 'OAuth2' => (
|
|
is => 'rw',
|
|
required => 1,
|
|
lazy => 1,
|
|
builder => '_build_OAuth2',
|
|
);
|
|
|
|
has 'content_url' => (
|
|
is => 'rw',
|
|
required => 0,
|
|
);
|
|
|
|
has 'results' => (
|
|
is => 'rw',
|
|
lazy => 1,
|
|
builder => '_build_results',
|
|
);
|
|
|
|
has 'save_token' => (
|
|
is => 'rw',
|
|
lazy => 1,
|
|
builder => '_save_token',
|
|
);
|
|
|
|
|
|
sub _build_db ($self) {
|
|
my $user = $self->db_user;
|
|
my $pass = $self->db_pass;
|
|
my $db_uri = $self->db_uri;
|
|
my $db_name = $self->db_name;
|
|
my $pg = Mojo::Pg->new("postgresql://$user:$pass\@$db_uri/$db_name");
|
|
my $db = $pg->db;
|
|
return $db;
|
|
}
|
|
|
|
sub _build_token ($self) {
|
|
my $user = $self->user;
|
|
my $db = $self->db;
|
|
my $token = $db->select('oauth2_tokens', ['token_string'], {username=>$user})->array;
|
|
return $token->[0];
|
|
}
|
|
|
|
sub _save_token ($self, $user, $token) {
|
|
my $db = $self->db;
|
|
#my $user = $self->user;
|
|
#my $token = $self->token;
|
|
|
|
if (! $db->select('oauth2_tokens', ['username'], {username=>$user} )->array) {
|
|
$db->insert('oauth2_tokens', {token_string=>$token, username=>$user,});
|
|
return;
|
|
}
|
|
else {
|
|
my $ts = strftime("%m/%d/%Y %H:%M:%S\n", localtime);
|
|
$db->update('oauth2_tokens', {token_string=>$token, modify_timestamp=>$ts}, {username=>$user});
|
|
return;
|
|
}
|
|
}
|
|
|
|
sub get_initial_access_token ($self) {
|
|
my $oauth2 = $self->Oauth2;
|
|
|
|
}
|
|
|
|
|
|
sub _build_refresh_token ($self) {
|
|
my $oauth2 = $self->OAuth2;
|
|
my $refresh_token = decode_json($self->token)->{'refresh_token'};
|
|
|
|
my $res = $oauth2->request_tokens(
|
|
grant_type => 'refresh_token',
|
|
refresh_token => $refresh_token,
|
|
client_id => $self->client_id,
|
|
client_secret => $self->client_secret,
|
|
);
|
|
|
|
p $res
|
|
}
|
|
|
|
sub _build_OAuth2 ($self) {
|
|
my $oauth2 = LWP::Authen::OAuth2->new(
|
|
client_id => $self->client_id,
|
|
client_secret => $self->client_secret,
|
|
redirect_uri => $self->redirect_uri,
|
|
authorization_endpoint => $self->authorization_endpoint,
|
|
token_endpoint => $self->token_endpoint,
|
|
#request_required_params => [ 'grant_type', 'client_id', 'client_secret'],
|
|
#request_optional_params => [ 'scope', 'code', 'refresh_token', 'authorization_token', 'redirect_uri'],
|
|
#refresh_required_params => ['client_id', 'client_secret', 'refresh_token'],
|
|
#refresh_optional_params
|
|
|
|
# Optional hook, but recommended.
|
|
save_tokens => sub{$self->_save_token(@_)},
|
|
save_tokens_args => [ $self->db, $self->user ],
|
|
|
|
# This is for when you have tokens from last time.
|
|
token_string => $self->token,
|
|
);
|
|
|
|
return $oauth2;
|
|
}
|
|
|
|
sub _build_results ($self) {
|
|
my $content_url = $self->content_url;
|
|
my $access_token = decode_json($self->token)->{'access_token'};
|
|
my $companyid = '193514809224424';
|
|
my $endpoint = "https://sandbox-quickbooks.api.intuit.com/v3/company/$companyid";
|
|
my $oauth2 = $self->OAuth2;
|
|
my $url = "$endpoint.$content_url";
|
|
my %headers = (Authorization => "Bearer $access_token",
|
|
Accept => 'application/json');
|
|
my $res = $oauth2->get($url, %headers);
|
|
my $json = $res->decoded_content;
|
|
return $json;
|
|
}
|
|
|
|
|
|
__PACKAGE__->meta->make_immutable; |