跟 facebook 取 access token 失敗?

发布于 2022-09-07 08:52:17 字数 2298 浏览 15 评论 0

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...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

素染倾城色 2022-09-14 08:52:17

是这样的:

  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']); 
}
烧了回忆取暖 2022-09-14 08:52:17

说下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访问获取用户信息接口

至此,授权流程结束

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文