我正在尝试使用php sdk这样获取Facebook用户ID
$fb = new Facebook\Facebook([ 'app_id' => '11111111111', 'app_secret' => '1111222211111112222', 'default_graph_version' => 'v2.4', ]); $helper = $fb->getRedirectLoginHelper(); $permissions = ['public_profile','email']; // Optional permissions $loginUrl = $helper->getLoginUrl('http://MyWebSite', $permissions); echo '<a href="' . $loginUrl . '">Log in with Facebook!</a>'; try { $accessToken = $helper->getAccessToken(); var_dump($accessToken); } catch (Facebook\Exceptions\FacebookResponseException $e) { // When Graph returns an error echo 'Graph returned an error: ' . $e->getMessage(); exit; } catch (Facebook\Exceptions\FacebookSDKException $e) { // When validation fails or other local issues echo 'Facebook SDK returned an error: ' . $e->getMessage(); exit; } if (!isset($accessToken)) { if ($helper->getError()) { header('HTTP/1.0 401 Unauthorized'); echo "Error: " . $helper->getError() . "\n"; echo "Error Code: " . $helper->getErrorCode() . "\n"; echo "Error Reason: " . $helper->getErrorReason() . "\n"; echo "Error Description: " . $helper->getErrorDescription() . "\n"; } else { header('HTTP/1.0 400 Bad Request'); echo 'Bad request'; } exit; } // Logged in echo '<h3>Access Token</h3>'; var_dump($accessToken->getValue()); // The OAuth 2.0 client handler helps us manage access tokens $oAuth2Client = $fb->getOAuth2Client(); // Get the access token metadata from /debug_token $tokenMetadata = $oAuth2Client->debugToken($accessToken); echo '<h3>Metadata</h3>'; var_dump($tokenMetadata); // Validation (these will throw FacebookSDKException's when they fail) $tokenMetadata->validateAppId($config['11111111111']); // If you know the user ID this access token belongs to, you can validate it here //$tokenMetadata->validateUserId('123'); $tokenMetadata->validateExpiration(); if (!$accessToken->isLongLived()) { // Exchanges a short-lived access token for a long-lived one try { $accessToken = $oAuth2Client->getLongLivedAccessToken($accessToken); } catch (Facebook\Exceptions\FacebookSDKException $e) { echo "<p>Error getting long-lived access token: " . $helper->getMessage() . "</p>\n\n"; exit; } echo '<h3>Long-lived</h3>'; var_dump($accessToken->getValue()); } $_SESSION['fb_access_token'] = (string)$accessToken;
但是它给了我这个错误:
Facebook SDK returned an error: Cross-site request forgery validation failed. The "state" param from the URL and session do not match.
请任何帮助,我是php的新手,也感谢Facebook sdk的任何帮助。
我发现,只要在生成登录URL之前启用了PHP会话,并且Facebook最终重定向到脚本的顶部,它就可以在不设置cookie的情况下正常运行。这是使用SDK的5.1版本。
在这两个脚本的顶部,我添加了…
if(!session_id()) { session_start(); }
…而且“行之有效”。
这是一个对我有用的准系统完整示例:
auth.php
if (!session_id()) { session_start(); } $oFB = new Facebook\Facebook([ 'app_id' => FACEBOOK_APP_ID, 'app_secret' => FACEBOOK_APP_SECRET ]); $oHelper = self::$oFB->getRedirectLoginHelper(); $sURL = $oHelper->getLoginUrl(FACEBOOK_AUTH_CALLBACK, FACEBOOK_PERMISSIONS); // Redirect or show link to user.
auth_callback.php
if (!session_id()) { session_start(); } $oFB = new Facebook\Facebook([ 'app_id' => FACEBOOK_APP_ID, 'app_secret' => FACEBOOK_APP_SECRET ]); $oHelper = self::$oFB->getRedirectLoginHelper(); $oAccessToken = $oHelper->getAccessToken(); if ($oAccessToken !== null) { $oResponse = self::$oFB->get('/me?fields=id,name,email', $oAccessToken); print_r($oResponse->getGraphUser()); }
另外,在回购文档中对此进行了说明。
警告:FacebookRedirectLoginHelper使用会话来存储CSRF值。在调用getLoginUrl()方法之前,需要确保已启用会话。通常,这在大多数Web框架中都是自动完成的,但是如果您不使用Web框架,则可以添加session_start();。到您的login.php和login- callback.php脚本的顶部。您可以覆盖默认的会话处理-请参阅下面的扩展点。
我要添加此注释,因为如果您碰巧正在运行自己的会话管理或并行运行多个Web服务器,请牢记这一点很重要。在这种情况下,依靠php的默认会话方法将永远无法工作。