Facebook-OpenGraph
view release on metacpan or search on metacpan
lib/Facebook/OpenGraph.pm view on Meta::CPAN
# https://developers.facebook.com/docs/facebook-login/manually-build-a-login-flow/
#
# Parameters for login dialog are shown here.
# Login Dialog > Parameters
# https://developers.facebook.com/docs/reference/dialogs/oauth/
sub auth_uri {
my ($self, $param_ref) = @_;
$param_ref ||= +{};
croak 'redirect_uri and app_id must be set'
unless $self->redirect_uri && $self->app_id;
# "A comma separated list of permission names which you would like people
# to grant your app."
if (my $scope_ref = ref $param_ref->{scope}) {
croak 'scope must be string or array ref' unless $scope_ref eq 'ARRAY';
$param_ref->{scope} = join q{,}, @{ $param_ref->{scope} };
}
# "The URL to redirect to after a button is clicked or tapped in the
# dialog."
$param_ref->{redirect_uri} = $self->redirect_uri;
# "Your App ID. This is called client_id instead of app_id for this
# particular method in order to be compliant with the OAuth 2.0
# specification."
$param_ref->{client_id} = $self->app_id;
# "If you are using the URL redirect dialog implementation, then this will
# be a full page display, shown within Facebook.com. This display type is
# called page."
$param_ref->{display} ||= 'page';
# "Response data is included as URL parameters and contains code parameter
# (an encrypted string unique to each login request). This is the default
# behaviour if this parameter is not specified."
$param_ref->{response_type} ||= 'code';
my $uri = $self->site_uri('/dialog/oauth', $param_ref);
# Platform Versioning > Making Versioned Requests > Dialogs.
# https://developers.facebook.com/docs/apps/versions#dialogs
$uri->path( $self->gen_versioned_path($uri->path) );
return $uri->as_string;
}
sub set_access_token {
my ($self, $token) = @_;
$self->{access_token} = $token;
}
# Access Tokens > App Tokens
# https://developers.facebook.com/docs/facebook-login/access-tokens/#apptokens
sub get_app_token {
my $self = shift;
# Document does not mention what grant_type is all about or what values can
# be set, but RFC 6749 covers the basic idea of grant types and its Section
# 4.4 describes Client Credentials Grant.
# http://tools.ietf.org/html/rfc6749#section-4.4
return $self->_get_token(+{grant_type => 'client_credentials'});
}
# Manually Build a Login Flow > Confirming identity > Exchanging code for an access token
# https://developers.facebook.com/docs/facebook-login/manually-build-a-login-flow
sub get_user_token_by_code {
my ($self, $code) = @_;
croak 'code is not given' unless $code;
croak 'redirect_uri must be set' unless $self->redirect_uri;
my $query_ref = +{
redirect_uri => $self->redirect_uri,
code => $code,
};
return $self->_get_token($query_ref);
}
sub get_user_token_by_cookie {
my ($self, $cookie_value) = @_;
croak 'cookie value is not given' unless $cookie_value;
my $parsed_signed_request = $self->parse_signed_request($cookie_value);
# https://github.com/oklahomer/p5-Facebook-OpenGraph/issues/1#issuecomment-41065480
# parsed content should be something like below.
# {
# algorithm => "HMAC-SHA256",
# issued_at => 1398180151,
# code => "SOME_OPAQUE_STRING",
# user_id => 44007581,
# };
croak q{"code" is not contained in cookie value: } . $cookie_value
unless $parsed_signed_request->{code};
# Redirect_uri MUST be empty string in this case.
# That's why I didn't use get_user_token_by_code().
my $query_ref = +{
code => $parsed_signed_request->{code},
redirect_uri => '',
};
return $self->_get_token($query_ref);
}
# Access Tokens > Expiration and Extending Tokens
# https://developers.facebook.com/docs/facebook-login/access-tokens/
sub exchange_token {
my ($self, $short_term_token) = @_;
croak 'short term token is not given' unless $short_term_token;
my $query_ref = +{
grant_type => 'fb_exchange_token',
fb_exchange_token => $short_term_token,
};
return $self->_get_token($query_ref);
}
sub _get_token {
my ($self, $param_ref) = @_;
( run in 1.750 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )