Amazon-CreatorsAPI

 view release on metacpan or  search on metacpan

lib/Amazon/CreatorsAPI/Auth.pm  view on Meta::CPAN

package Amazon::CreatorsAPI::Auth;
use strict;
use warnings;
use Carp qw/croak/;
use JSON qw//;
use HTTP::Tiny;
use WWW::Form::UrlEncoded qw/build_urlencoded/;
use Class::Accessor::Lite (
    ro => [qw/
        credential_id
        credential_secret
        credential_version
        is_lwa
        auth_endpoint
        ua
        grant_type
    /],
    rw => [qw/
        access_token
        expires_at
    /],
);

our $JSON = JSON->new;

sub new {
    my $class              = shift;
    my $credential_id      = shift or croak 'credential_id is required';
    my $credential_secret  = shift or croak 'credential_secret is required';
    my $credential_version = shift or croak 'credential_version is required';
    my $opt                = shift || +{};

    return bless +{
        credential_id      => $credential_id,
        credential_secret  => $credential_secret,
        credential_version => $credential_version,
        is_lwa             => !!($credential_version =~ m!^3\.!),
        auth_endpoint      => $opt->{auth_endpoint} || _auth_endpoint($credential_version),
        ua                 => $opt->{ua} || HTTP::Tiny->new,
        grant_type         => $opt->{grant_type} || 'client_credentials',
        access_token       => '',
        expires_at         => 0,
    }, $class;
}

sub get_access_token {
    my $self = shift;

    if ($self->_is_valid_token) {
        return $self->access_token;
    }

    return $self->_refresh_token;
}

sub _is_valid_token {
    my $self = shift;

    return $self->access_token && $self->expires_at && time() < $self->expires_at;
}

sub _refresh_token {
    my $self = shift;

    my $res;
    if ($self->is_lwa) {
        $res = $self->ua->request(
            'POST',
            $self->auth_endpoint,
            {
                'headers' => {
                    'Content-Type' => 'application/json',
                },
                'content' => $JSON->encode({
                    'grant_type' => $self->grant_type,
                    'client_id'  => $self->credential_id,
                    'client_secret' => $self->credential_secret,
                    'scope' => 'creatorsapi::default',
                }),
            },
        );
    }
    else {
        $res = $self->ua->request(
            'POST',
            $self->auth_endpoint,
            {
                'headers' => {
                    'Content-Type' => 'application/x-www-form-urlencoded',
                },
                'content' => build_urlencoded(
                    'grant_type' => $self->grant_type,
                    'client_id'  => $self->credential_id,



( run in 0.644 second using v1.01-cache-2.11-cpan-39bf76dae61 )