鍍金池/ 問答/HTML5  PHP  網絡安全/ 跟 facebook 取 access token 失???

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

回答
編輯回答
乖乖噠

是這樣的:

  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']); 
}
2018年6月30日 08:48
編輯回答
厭惡我

說下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參數(shù),state需要和第一步做匹配,如果不匹配,證明不是第三方回復的。
  3. 使用code換取access_token和Openid
  4. 使用access_token和openid訪問獲取用戶信息接口

至此,授權流程結束

2018年9月9日 21:41