跟 facebook 取 access token 失敗?

login.php:

require_once '/vendor/autoload.php';

  $fb = new Facebook\Facebook([
    'app_id' => 'xxx',
    'app_secret' => 'xxx', 
    'default_graph_version' => 'v2.8',
    ]);

  $helper = $fb->getRedirectLoginHelper();

  $permissions = ['email'];
  $loginUrl = $helper->getLoginUrl('https://xxx.xxx.com/fb-sdk/fb-callback.php', $permissions);

  echo '<a href="' . htmlspecialchars($loginUrl) . '">Log in with Facebook!</a>';

fb-callback.php:

require_once '/vendor/autoload.php';

$fb = new \Facebook\Facebook([
  'app_id' => 'xxx',
  'app_secret' => 'xxx',
  'default_graph_version' => 'v2.8',

]);

// Use one of the helper classes to get a Facebook\Authentication\AccessToken entity.
$helper = $fb->getRedirectLoginHelper();
//   $helper = $fb->getJavaScriptHelper();
//   $helper = $fb->getCanvasHelper();
//   $helper = $fb->getPageTabHelper();

try {
  $accessToken = $helper->getAccessToken();
  // Get the \Facebook\GraphNodes\GraphUser object for the current user.
  // If you provided a 'default_access_token', the '{access-token}' is optional.
  $response = $fb->get('/me?fields=id,name,email', $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;
}

$me = $response->getGraphUser();
echo 'Logged in as ' . $me->getName();

他是會卡在 $accessToken = $helper->getAccessToken();就不跑了
沒辦法印出任何東西
而且報錯:
Facebook SDK returned an error: Cross-site request forgery validation failed. Required param "state" missing from persistent data.

他回我的 fb-callback.php 有這兩個key

fb-callback.php?code=***&state=***#_=_

我以為是token,所以我就都試試看取代 $accessToken
但還是不對,說token格式不對
到底哪裡有問題?
我確定登入是可以的
當我進去login.php後按下登入,會到facebook,然後問我同不同意,我按同意後就直接跑到 fb-callback.php 了,但就報錯說沒有token

我是按照這個的:https://github.com/facebook/p...

阅读 7.3k
2 个回答

是这样的:

  1. 首先你要用graph_versionv2.12或者v3.0。 v2.8已经淘汰了,之后会报错的。
  2. 很有可能你的服务器设置的问题所以无法传递state到sdk里面,解决办法:
// 在fb-callback.php页顶部加入session
if (!session_id()) { 
    session_start(); 
}

// 然后强制传值
$helper = $fb->getRedirectLoginHelper(); 
if (isset($_GET['state'])) { 
    $helper->getPersistentDataHandler()->set('state', $_GET['state']); 
}

说下oauth2.0授权流程吧,所有oauth2.0的应用都适用,比如twitter,google,facebook,etc.

  1. 构造授权链接,也就是$loginUrl = $helper->getLoginUrl('https://xxx.xxx.com/fb-sdk/fb-callback.php', $permissions),这里一般需要传入一个state(一般为随机字符串)
  2. 授权完成后第三方(本例为facebook)给callback传入statecode参数,state需要和第一步做匹配,如果不匹配,证明不是第三方回复的。
  3. 使用code换取access_token和Openid
  4. 使用access_token和openid访问获取用户信息接口

至此,授权流程结束

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题