summaryrefslogtreecommitdiff
path: root/lib/facebook-graph-sdk/src/Facebook/Helpers
diff options
context:
space:
mode:
authoremkael <emkael@tlen.pl>2017-01-16 22:04:43 +0100
committeremkael <emkael@tlen.pl>2017-01-16 22:50:24 +0100
commit677953067f2bb5502a70f0d004f1ac844b18a128 (patch)
tree003c26454b543c2a8d73f0602446482fdbbef8db /lib/facebook-graph-sdk/src/Facebook/Helpers
parentf7b2bfae9778af2c99e0c7fe7b2634e0f4f0973f (diff)
* Facebook support
Diffstat (limited to 'lib/facebook-graph-sdk/src/Facebook/Helpers')
-rw-r--r--lib/facebook-graph-sdk/src/Facebook/Helpers/FacebookCanvasHelper.php52
-rw-r--r--lib/facebook-graph-sdk/src/Facebook/Helpers/FacebookJavaScriptHelper.php42
-rw-r--r--lib/facebook-graph-sdk/src/Facebook/Helpers/FacebookPageTabHelper.php95
-rw-r--r--lib/facebook-graph-sdk/src/Facebook/Helpers/FacebookRedirectLoginHelper.php360
-rw-r--r--lib/facebook-graph-sdk/src/Facebook/Helpers/FacebookSignedRequestFromInputHelper.php166
5 files changed, 715 insertions, 0 deletions
diff --git a/lib/facebook-graph-sdk/src/Facebook/Helpers/FacebookCanvasHelper.php b/lib/facebook-graph-sdk/src/Facebook/Helpers/FacebookCanvasHelper.php
new file mode 100644
index 0000000..8068526
--- /dev/null
+++ b/lib/facebook-graph-sdk/src/Facebook/Helpers/FacebookCanvasHelper.php
@@ -0,0 +1,52 @@
+<?php
+/**
+ * Copyright 2014 Facebook, Inc.
+ *
+ * You are hereby granted a non-exclusive, worldwide, royalty-free license to
+ * use, copy, modify, and distribute this software in source code or binary
+ * form for use in connection with the web services and APIs provided by
+ * Facebook.
+ *
+ * As with any software that integrates with the Facebook platform, your use
+ * of this software is subject to the Facebook Developer Principles and
+ * Policies [http://developers.facebook.com/policy/]. This copyright notice
+ * shall be included in all copies or substantial portions of the software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ */
+namespace Facebook\Helpers;
+
+/**
+ * Class FacebookCanvasLoginHelper
+ *
+ * @package Facebook
+ */
+class FacebookCanvasHelper extends FacebookSignedRequestFromInputHelper
+{
+ /**
+ * Returns the app data value.
+ *
+ * @return mixed|null
+ */
+ public function getAppData()
+ {
+ return $this->signedRequest ? $this->signedRequest->get('app_data') : null;
+ }
+
+ /**
+ * Get raw signed request from POST.
+ *
+ * @return string|null
+ */
+ public function getRawSignedRequest()
+ {
+ return $this->getRawSignedRequestFromPost() ?: null;
+ }
+}
diff --git a/lib/facebook-graph-sdk/src/Facebook/Helpers/FacebookJavaScriptHelper.php b/lib/facebook-graph-sdk/src/Facebook/Helpers/FacebookJavaScriptHelper.php
new file mode 100644
index 0000000..5d406b5
--- /dev/null
+++ b/lib/facebook-graph-sdk/src/Facebook/Helpers/FacebookJavaScriptHelper.php
@@ -0,0 +1,42 @@
+<?php
+/**
+ * Copyright 2014 Facebook, Inc.
+ *
+ * You are hereby granted a non-exclusive, worldwide, royalty-free license to
+ * use, copy, modify, and distribute this software in source code or binary
+ * form for use in connection with the web services and APIs provided by
+ * Facebook.
+ *
+ * As with any software that integrates with the Facebook platform, your use
+ * of this software is subject to the Facebook Developer Principles and
+ * Policies [http://developers.facebook.com/policy/]. This copyright notice
+ * shall be included in all copies or substantial portions of the software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ */
+namespace Facebook\Helpers;
+
+/**
+ * Class FacebookJavaScriptLoginHelper
+ *
+ * @package Facebook
+ */
+class FacebookJavaScriptHelper extends FacebookSignedRequestFromInputHelper
+{
+ /**
+ * Get raw signed request from the cookie.
+ *
+ * @return string|null
+ */
+ public function getRawSignedRequest()
+ {
+ return $this->getRawSignedRequestFromCookie();
+ }
+}
diff --git a/lib/facebook-graph-sdk/src/Facebook/Helpers/FacebookPageTabHelper.php b/lib/facebook-graph-sdk/src/Facebook/Helpers/FacebookPageTabHelper.php
new file mode 100644
index 0000000..ee43f5e
--- /dev/null
+++ b/lib/facebook-graph-sdk/src/Facebook/Helpers/FacebookPageTabHelper.php
@@ -0,0 +1,95 @@
+<?php
+/**
+ * Copyright 2014 Facebook, Inc.
+ *
+ * You are hereby granted a non-exclusive, worldwide, royalty-free license to
+ * use, copy, modify, and distribute this software in source code or binary
+ * form for use in connection with the web services and APIs provided by
+ * Facebook.
+ *
+ * As with any software that integrates with the Facebook platform, your use
+ * of this software is subject to the Facebook Developer Principles and
+ * Policies [http://developers.facebook.com/policy/]. This copyright notice
+ * shall be included in all copies or substantial portions of the software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ */
+namespace Facebook\Helpers;
+
+use Facebook\FacebookApp;
+use Facebook\FacebookClient;
+
+/**
+ * Class FacebookPageTabHelper
+ *
+ * @package Facebook
+ */
+class FacebookPageTabHelper extends FacebookCanvasHelper
+{
+ /**
+ * @var array|null
+ */
+ protected $pageData;
+
+ /**
+ * Initialize the helper and process available signed request data.
+ *
+ * @param FacebookApp $app The FacebookApp entity.
+ * @param FacebookClient $client The client to make HTTP requests.
+ * @param string|null $graphVersion The version of Graph to use.
+ */
+ public function __construct(FacebookApp $app, FacebookClient $client, $graphVersion = null)
+ {
+ parent::__construct($app, $client, $graphVersion);
+
+ if (!$this->signedRequest) {
+ return;
+ }
+
+ $this->pageData = $this->signedRequest->get('page');
+ }
+
+ /**
+ * Returns a value from the page data.
+ *
+ * @param string $key
+ * @param mixed|null $default
+ *
+ * @return mixed|null
+ */
+ public function getPageData($key, $default = null)
+ {
+ if (isset($this->pageData[$key])) {
+ return $this->pageData[$key];
+ }
+
+ return $default;
+ }
+
+ /**
+ * Returns true if the user is an admin.
+ *
+ * @return boolean
+ */
+ public function isAdmin()
+ {
+ return $this->getPageData('admin') === true;
+ }
+
+ /**
+ * Returns the page id if available.
+ *
+ * @return string|null
+ */
+ public function getPageId()
+ {
+ return $this->getPageData('id');
+ }
+}
diff --git a/lib/facebook-graph-sdk/src/Facebook/Helpers/FacebookRedirectLoginHelper.php b/lib/facebook-graph-sdk/src/Facebook/Helpers/FacebookRedirectLoginHelper.php
new file mode 100644
index 0000000..144a5b4
--- /dev/null
+++ b/lib/facebook-graph-sdk/src/Facebook/Helpers/FacebookRedirectLoginHelper.php
@@ -0,0 +1,360 @@
+<?php
+/**
+ * Copyright 2014 Facebook, Inc.
+ *
+ * You are hereby granted a non-exclusive, worldwide, royalty-free license to
+ * use, copy, modify, and distribute this software in source code or binary
+ * form for use in connection with the web services and APIs provided by
+ * Facebook.
+ *
+ * As with any software that integrates with the Facebook platform, your use
+ * of this software is subject to the Facebook Developer Principles and
+ * Policies [http://developers.facebook.com/policy/]. This copyright notice
+ * shall be included in all copies or substantial portions of the software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ */
+namespace Facebook\Helpers;
+
+use Facebook\Authentication\AccessToken;
+use Facebook\Authentication\OAuth2Client;
+use Facebook\Url\UrlDetectionInterface;
+use Facebook\Url\FacebookUrlDetectionHandler;
+use Facebook\Url\FacebookUrlManipulator;
+use Facebook\PersistentData\PersistentDataInterface;
+use Facebook\PersistentData\FacebookSessionPersistentDataHandler;
+use Facebook\PseudoRandomString\PseudoRandomStringGeneratorInterface;
+use Facebook\PseudoRandomString\McryptPseudoRandomStringGenerator;
+use Facebook\PseudoRandomString\OpenSslPseudoRandomStringGenerator;
+use Facebook\PseudoRandomString\UrandomPseudoRandomStringGenerator;
+use Facebook\Exceptions\FacebookSDKException;
+
+/**
+ * Class FacebookRedirectLoginHelper
+ *
+ * @package Facebook
+ */
+class FacebookRedirectLoginHelper
+{
+ /**
+ * @const int The length of CSRF string to validate the login link.
+ */
+ const CSRF_LENGTH = 32;
+
+ /**
+ * @var OAuth2Client The OAuth 2.0 client service.
+ */
+ protected $oAuth2Client;
+
+ /**
+ * @var UrlDetectionInterface The URL detection handler.
+ */
+ protected $urlDetectionHandler;
+
+ /**
+ * @var PersistentDataInterface The persistent data handler.
+ */
+ protected $persistentDataHandler;
+
+ /**
+ * @var PseudoRandomStringGeneratorInterface The cryptographically secure pseudo-random string generator.
+ */
+ protected $pseudoRandomStringGenerator;
+
+ /**
+ * @param OAuth2Client $oAuth2Client The OAuth 2.0 client service.
+ * @param PersistentDataInterface|null $persistentDataHandler The persistent data handler.
+ * @param UrlDetectionInterface|null $urlHandler The URL detection handler.
+ * @param PseudoRandomStringGeneratorInterface|null $prsg The cryptographically secure pseudo-random string generator.
+ */
+ public function __construct(OAuth2Client $oAuth2Client, PersistentDataInterface $persistentDataHandler = null, UrlDetectionInterface $urlHandler = null, PseudoRandomStringGeneratorInterface $prsg = null)
+ {
+ $this->oAuth2Client = $oAuth2Client;
+ $this->persistentDataHandler = $persistentDataHandler ?: new FacebookSessionPersistentDataHandler();
+ $this->urlDetectionHandler = $urlHandler ?: new FacebookUrlDetectionHandler();
+ $this->pseudoRandomStringGenerator = $prsg ?: $this->detectPseudoRandomStringGenerator();
+ }
+
+ /**
+ * Returns the persistent data handler.
+ *
+ * @return PersistentDataInterface
+ */
+ public function getPersistentDataHandler()
+ {
+ return $this->persistentDataHandler;
+ }
+
+ /**
+ * Returns the URL detection handler.
+ *
+ * @return UrlDetectionInterface
+ */
+ public function getUrlDetectionHandler()
+ {
+ return $this->urlDetectionHandler;
+ }
+
+ /**
+ * Returns the cryptographically secure pseudo-random string generator.
+ *
+ * @return PseudoRandomStringGeneratorInterface
+ */
+ public function getPseudoRandomStringGenerator()
+ {
+ return $this->pseudoRandomStringGenerator;
+ }
+
+ /**
+ * Detects which pseudo-random string generator to use.
+ *
+ * @return PseudoRandomStringGeneratorInterface
+ *
+ * @throws FacebookSDKException
+ */
+ public function detectPseudoRandomStringGenerator()
+ {
+ // Since openssl_random_pseudo_bytes() can sometimes return non-cryptographically
+ // secure pseudo-random strings (in rare cases), we check for mcrypt_create_iv() first.
+ if (function_exists('mcrypt_create_iv')) {
+ return new McryptPseudoRandomStringGenerator();
+ }
+
+ if (function_exists('openssl_random_pseudo_bytes')) {
+ return new OpenSslPseudoRandomStringGenerator();
+ }
+
+ if (!ini_get('open_basedir') && is_readable('/dev/urandom')) {
+ return new UrandomPseudoRandomStringGenerator();
+ }
+
+ throw new FacebookSDKException('Unable to detect a cryptographically secure pseudo-random string generator.');
+ }
+
+ /**
+ * Stores CSRF state and returns a URL to which the user should be sent to in order to continue the login process with Facebook.
+ *
+ * @param string $redirectUrl The URL Facebook should redirect users to after login.
+ * @param array $scope List of permissions to request during login.
+ * @param array $params An array of parameters to generate URL.
+ * @param string $separator The separator to use in http_build_query().
+ *
+ * @return string
+ */
+ private function makeUrl($redirectUrl, array $scope, array $params = [], $separator = '&')
+ {
+ $state = $this->pseudoRandomStringGenerator->getPseudoRandomString(static::CSRF_LENGTH);
+ $this->persistentDataHandler->set('state', $state);
+
+ return $this->oAuth2Client->getAuthorizationUrl($redirectUrl, $state, $scope, $params, $separator);
+ }
+
+ /**
+ * Returns the URL to send the user in order to login to Facebook.
+ *
+ * @param string $redirectUrl The URL Facebook should redirect users to after login.
+ * @param array $scope List of permissions to request during login.
+ * @param string $separator The separator to use in http_build_query().
+ *
+ * @return string
+ */
+ public function getLoginUrl($redirectUrl, array $scope = [], $separator = '&')
+ {
+ return $this->makeUrl($redirectUrl, $scope, [], $separator);
+ }
+
+ /**
+ * Returns the URL to send the user in order to log out of Facebook.
+ *
+ * @param AccessToken|string $accessToken The access token that will be logged out.
+ * @param string $next The url Facebook should redirect the user to after a successful logout.
+ * @param string $separator The separator to use in http_build_query().
+ *
+ * @return string
+ *
+ * @throws FacebookSDKException
+ */
+ public function getLogoutUrl($accessToken, $next, $separator = '&')
+ {
+ if (!$accessToken instanceof AccessToken) {
+ $accessToken = new AccessToken($accessToken);
+ }
+
+ if ($accessToken->isAppAccessToken()) {
+ throw new FacebookSDKException('Cannot generate a logout URL with an app access token.', 722);
+ }
+
+ $params = [
+ 'next' => $next,
+ 'access_token' => $accessToken->getValue(),
+ ];
+
+ return 'https://www.facebook.com/logout.php?' . http_build_query($params, null, $separator);
+ }
+
+ /**
+ * Returns the URL to send the user in order to login to Facebook with permission(s) to be re-asked.
+ *
+ * @param string $redirectUrl The URL Facebook should redirect users to after login.
+ * @param array $scope List of permissions to request during login.
+ * @param string $separator The separator to use in http_build_query().
+ *
+ * @return string
+ */
+ public function getReRequestUrl($redirectUrl, array $scope = [], $separator = '&')
+ {
+ $params = ['auth_type' => 'rerequest'];
+
+ return $this->makeUrl($redirectUrl, $scope, $params, $separator);
+ }
+
+ /**
+ * Returns the URL to send the user in order to login to Facebook with user to be re-authenticated.
+ *
+ * @param string $redirectUrl The URL Facebook should redirect users to after login.
+ * @param array $scope List of permissions to request during login.
+ * @param string $separator The separator to use in http_build_query().
+ *
+ * @return string
+ */
+ public function getReAuthenticationUrl($redirectUrl, array $scope = [], $separator = '&')
+ {
+ $params = ['auth_type' => 'reauthenticate'];
+
+ return $this->makeUrl($redirectUrl, $scope, $params, $separator);
+ }
+
+ /**
+ * Takes a valid code from a login redirect, and returns an AccessToken entity.
+ *
+ * @param string|null $redirectUrl The redirect URL.
+ *
+ * @return AccessToken|null
+ *
+ * @throws FacebookSDKException
+ */
+ public function getAccessToken($redirectUrl = null)
+ {
+ if (!$code = $this->getCode()) {
+ return null;
+ }
+
+ $this->validateCsrf();
+
+ $redirectUrl = $redirectUrl ?: $this->urlDetectionHandler->getCurrentUrl();
+ // At minimum we need to remove the state param
+ $redirectUrl = FacebookUrlManipulator::removeParamsFromUrl($redirectUrl, ['state']);
+
+ return $this->oAuth2Client->getAccessTokenFromCode($code, $redirectUrl);
+ }
+
+ /**
+ * Validate the request against a cross-site request forgery.
+ *
+ * @throws FacebookSDKException
+ */
+ protected function validateCsrf()
+ {
+ $state = $this->getState();
+ $savedState = $this->persistentDataHandler->get('state');
+
+ if (!$state || !$savedState) {
+ throw new FacebookSDKException('Cross-site request forgery validation failed. Required param "state" missing.');
+ }
+
+ $savedLen = strlen($savedState);
+ $givenLen = strlen($state);
+
+ if ($savedLen !== $givenLen) {
+ throw new FacebookSDKException('Cross-site request forgery validation failed. The "state" param from the URL and session do not match.');
+ }
+
+ $result = 0;
+ for ($i = 0; $i < $savedLen; $i++) {
+ $result |= ord($state[$i]) ^ ord($savedState[$i]);
+ }
+
+ if ($result !== 0) {
+ throw new FacebookSDKException('Cross-site request forgery validation failed. The "state" param from the URL and session do not match.');
+ }
+ }
+
+ /**
+ * Return the code.
+ *
+ * @return string|null
+ */
+ protected function getCode()
+ {
+ return $this->getInput('code');
+ }
+
+ /**
+ * Return the state.
+ *
+ * @return string|null
+ */
+ protected function getState()
+ {
+ return $this->getInput('state');
+ }
+
+ /**
+ * Return the error code.
+ *
+ * @return string|null
+ */
+ public function getErrorCode()
+ {
+ return $this->getInput('error_code');
+ }
+
+ /**
+ * Returns the error.
+ *
+ * @return string|null
+ */
+ public function getError()
+ {
+ return $this->getInput('error');
+ }
+
+ /**
+ * Returns the error reason.
+ *
+ * @return string|null
+ */
+ public function getErrorReason()
+ {
+ return $this->getInput('error_reason');
+ }
+
+ /**
+ * Returns the error description.
+ *
+ * @return string|null
+ */
+ public function getErrorDescription()
+ {
+ return $this->getInput('error_description');
+ }
+
+ /**
+ * Returns a value from a GET param.
+ *
+ * @param string $key
+ *
+ * @return string|null
+ */
+ private function getInput($key)
+ {
+ return isset($_GET[$key]) ? $_GET[$key] : null;
+ }
+}
diff --git a/lib/facebook-graph-sdk/src/Facebook/Helpers/FacebookSignedRequestFromInputHelper.php b/lib/facebook-graph-sdk/src/Facebook/Helpers/FacebookSignedRequestFromInputHelper.php
new file mode 100644
index 0000000..aafa246
--- /dev/null
+++ b/lib/facebook-graph-sdk/src/Facebook/Helpers/FacebookSignedRequestFromInputHelper.php
@@ -0,0 +1,166 @@
+<?php
+/**
+ * Copyright 2014 Facebook, Inc.
+ *
+ * You are hereby granted a non-exclusive, worldwide, royalty-free license to
+ * use, copy, modify, and distribute this software in source code or binary
+ * form for use in connection with the web services and APIs provided by
+ * Facebook.
+ *
+ * As with any software that integrates with the Facebook platform, your use
+ * of this software is subject to the Facebook Developer Principles and
+ * Policies [http://developers.facebook.com/policy/]. This copyright notice
+ * shall be included in all copies or substantial portions of the software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ */
+namespace Facebook\Helpers;
+
+use Facebook\Facebook;
+use Facebook\FacebookApp;
+use Facebook\FacebookClient;
+use Facebook\SignedRequest;
+use Facebook\Authentication\AccessToken;
+use Facebook\Authentication\OAuth2Client;
+
+/**
+ * Class FacebookSignedRequestFromInputHelper
+ *
+ * @package Facebook
+ */
+abstract class FacebookSignedRequestFromInputHelper
+{
+ /**
+ * @var SignedRequest|null The SignedRequest entity.
+ */
+ protected $signedRequest;
+
+ /**
+ * @var FacebookApp The FacebookApp entity.
+ */
+ protected $app;
+
+ /**
+ * @var OAuth2Client The OAuth 2.0 client service.
+ */
+ protected $oAuth2Client;
+
+ /**
+ * Initialize the helper and process available signed request data.
+ *
+ * @param FacebookApp $app The FacebookApp entity.
+ * @param FacebookClient $client The client to make HTTP requests.
+ * @param string|null $graphVersion The version of Graph to use.
+ */
+ public function __construct(FacebookApp $app, FacebookClient $client, $graphVersion = null)
+ {
+ $this->app = $app;
+ $graphVersion = $graphVersion ?: Facebook::DEFAULT_GRAPH_VERSION;
+ $this->oAuth2Client = new OAuth2Client($this->app, $client, $graphVersion);
+
+ $this->instantiateSignedRequest();
+ }
+
+ /**
+ * Instantiates a new SignedRequest entity.
+ *
+ * @param string|null
+ */
+ public function instantiateSignedRequest($rawSignedRequest = null)
+ {
+ $rawSignedRequest = $rawSignedRequest ?: $this->getRawSignedRequest();
+
+ if (!$rawSignedRequest) {
+ return;
+ }
+
+ $this->signedRequest = new SignedRequest($this->app, $rawSignedRequest);
+ }
+
+ /**
+ * Returns an AccessToken entity from the signed request.
+ *
+ * @return AccessToken|null
+ *
+ * @throws \Facebook\Exceptions\FacebookSDKException
+ */
+ public function getAccessToken()
+ {
+ if ($this->signedRequest && $this->signedRequest->hasOAuthData()) {
+ $code = $this->signedRequest->get('code');
+ $accessToken = $this->signedRequest->get('oauth_token');
+
+ if ($code && !$accessToken) {
+ return $this->oAuth2Client->getAccessTokenFromCode($code);
+ }
+
+ $expiresAt = $this->signedRequest->get('expires', 0);
+
+ return new AccessToken($accessToken, $expiresAt);
+ }
+
+ return null;
+ }
+
+ /**
+ * Returns the SignedRequest entity.
+ *
+ * @return SignedRequest|null
+ */
+ public function getSignedRequest()
+ {
+ return $this->signedRequest;
+ }
+
+ /**
+ * Returns the user_id if available.
+ *
+ * @return string|null
+ */
+ public function getUserId()
+ {
+ return $this->signedRequest ? $this->signedRequest->getUserId() : null;
+ }
+
+ /**
+ * Get raw signed request from input.
+ *
+ * @return string|null
+ */
+ abstract public function getRawSignedRequest();
+
+ /**
+ * Get raw signed request from POST input.
+ *
+ * @return string|null
+ */
+ public function getRawSignedRequestFromPost()
+ {
+ if (isset($_POST['signed_request'])) {
+ return $_POST['signed_request'];
+ }
+
+ return null;
+ }
+
+ /**
+ * Get raw signed request from cookie set from the Javascript SDK.
+ *
+ * @return string|null
+ */
+ public function getRawSignedRequestFromCookie()
+ {
+ if (isset($_COOKIE['fbsr_' . $this->app->getId()])) {
+ return $_COOKIE['fbsr_' . $this->app->getId()];
+ }
+
+ return null;
+ }
+}