Bb-Collaborate-Ultra
view release on metacpan or search on metacpan
lib/Bb/Collaborate/Ultra/Connection.pm view on Meta::CPAN
my $connection = Bb::Collaborate::Ultra::Connection->new(\%params);
=head1 METHODS
=cut
has 'issuer' => (is => 'rw', isa => 'Str', required => 1);
has 'secret' => (is => 'rw', isa => 'Str', required => 1);
has 'host' => (is => 'rw', isa => 'Str', required => 1);
has '_client' => (is => 'rw', isa => 'REST::Client' );
=head2 auth
Holds the authorization token, obtained from the Collaborate server.
The connect method mast be invoked to obtain an C<auth> token. The C<renew_lease> method may be later used to extend the session, obtaining
an new C<auth> token.
=head2 debug
$connection->debug(1); # enable debugging
When set, a trace is enabled of requests and responses to and from the Collaborate server
=cut
has 'auth' => (is => 'rw', isa => 'Bb::Collaborate::Ultra::Connection::Token' );
has 'debug' => (is => 'rw', isa => 'Int' );
sub _response {
my $self = shift;
my $client = shift || $self->client;
my $response_content = $client->responseContent;
my $response_code = $client->responseCode;
warn "RESPONSE: [$response_code] ". $response_content. "\n\n"
if $self->debug;
my $response_data;
if ($response_content) {
try {
$response_data = from_json( $response_content);
}
catch {
die "[$response_code] $response_content";
};
die "[$response_code] $response_data->{errorKey} : $response_data->{errorMessage}\n"
if $response_data->{errorKey};
}
die "bad HTTP response code: $response_code"
unless $response_code == 200;
$response_data;
}
use constant JWS_RSA_256 => 'HS256';
use constant JWT_EXPIRY => 4 * 60; # 4 minutes
=head2 connect
This method should be called once, with a newly created L<Bb::Collaborate::Ultra::Connection> object to contact the server and authorize the credentials.
my %credentials = (
issuer => 'OUUK-REST-API12340ABCD',
secret => 'ABCDEF0123456789AA',
host => 'https://xx-csa.bbcollab.com',
);
# connect to server
my $connection = Bb::Collaborate::Ultra::Connection->new(\%credentials);
$connection->connect;
=cut
sub connect {
my $self = shift;
my $client = $self->client;
$self->renew_lease
unless $self->auth;
}
=head2 client
Returns the underlying client connection of type L<REST::Client>.
=cut
sub client {
my $self = shift;
my $client = $self->_client;
unless ($client) {
$client= REST::Client->new;
$client->setHost($self->host);
$self->_client($client);
}
$client;
}
=head2 renew_lease
if ($connection->auth->expires_in < time() + 60) {
# connection is about to expire; keep it alive.
$connection->renew_lease;
}
A authorization token typically remains valid for several minutes. This method
can be used to extend the lease, whilst keeping the current connection.
=cut
sub renew_lease {
my $self = shift;
my $expiry = shift || time() + JWT_EXPIRY;
my $class = 'Bb::Collaborate::Ultra::Connection::Token';
my $client = $self->client;
my $claims = {
iss => $self->issuer,
sub => $self->issuer,
exp => $expiry,
};
my $jwt = encode_jwt( payload => $claims, key => $self->secret, alg => JWS_RSA_256);
my $query = $client->buildQuery({
grant_type => 'urn:ietf:params:oauth:grant-type:jwt-bearer',
assertion => $jwt,
});
( run in 1.298 second using v1.01-cache-2.11-cpan-39bf76dae61 )