OAuth2-Box/lib/OAuth2/Box.pm
package OAuth2::Box;
# ABSTRACT: Authorize with Box.com
use strict;
use warnings;
use Carp::Assert;
use HTTP::Tiny;
use JSON;
use Moo;
use Types::Standard qw(Str InstanceOf);
use URI;
our $VERSION = 0.03;
use constant BOX_URL => 'https://www.box.com/api/oauth2/';
has url => ( is => 'ro', isa => Str, required => 1, default => sub { BOX_URL . 'authorize' } );
has token_url => ( is => 'ro', isa => Str, required => 1, default => sub { BOX_URL . 'token' } );
has client_id => ( is => 'ro', isa => Str, required => 1 );
has client_secret => ( is => 'ro', isa => Str, required => 1 );
has redirect_uri => ( is => 'ro', isa => Str, required => 1 );
has agent => ( is => 'ro', isa => InstanceOf["HTTP::Tiny"], lazy => 1, default => sub { HTTP::Tiny->new } );
has jsonp => ( is => 'lazy', isa => InstanceOf["JSON"] );
sub _build_jsonp { JSON->new->allow_nonref }
sub authorization_uri {
my ($self, %param) = @_;
assert( $param{state}, 'need state' );
my $uri = URI->new( $self->url );
$uri->query_form(
client_id => $self->client_id,
response_type => 'code',
redirect_uri => $self->redirect_uri,
state => $param{state},
);
return $uri;
}
sub authorize {
my ($self, %param) = @_;
assert( $param{code}, 'need code' );
return $self->_do_request(
code => $param{code},
grant_type => 'authorization_code',
);
}
sub refresh_token {
my ($self, %param) = @_;
assert( $param{refresh_token}, 'need refresh_token' );
return $self->_do_request(
refresh_token => $param{refresh_token},
grant_type => 'refresh_token',
);
}
sub _do_request {
my ($self, %param) = @_;
my $result = $self->agent->post_form(
$self->token_url,
{
client_id => $self->client_id,
client_secret => $self->client_secret,
redirect_uri => $self->redirect_uri,
%param,
},
);
if ( $result->{success} and $result->{content} ) {
my $data = $self->jsonp->decode( $result->{content} );
return wantarray ?
( $data->{access_token}, $data ) :
$data->{access_token};
}
return;
}
1;
__END__
=pod
=head1 NAME
OAuth2::Box - Authorize with Box.com
=head1 VERSION
version 0.03
=head1 SYNOPSIS
use OAuth2::Box;
my $box_oauth = OAuth2::Box->new(
client_id => 'app_client_id',
client_secret => 'app_client_secret',
redirect_uri => 'http://your.app.tld/auth',
);
my $authorization_url = $box_oauth->authorization_url(
state => 'authorized',
);
my $auth_token = $box_oauth->authorize(
code => '12345',
);
my ($auth_token, $info) = $box_oauth->authorize(
code => '12345',
);
my ($auth_token, $info) = $box_oauth->refresh_token(
refresh_token => '12abc42319de1a0',
);
=head1 METHODS
=head2 authorization_uri
=head2 authorize
=head2 refresh_token
=head1 AUTHOR
Renee Baecker <reneeb@cpan.org>
=head1 COPYRIGHT AND LICENSE
This software is Copyright (c) 2013 by Renee Baecker.
This is free software, licensed under:
The Artistic License 2.0 (GPL Compatible)
=cut