【问题标题】:facebook sdk (php) can't get access tokenfacebook sdk (php) 无法获取访问令牌
【发布时间】:2013-02-22 09:59:44
【问题描述】:

编辑:见这张照片:http://trackauthoritymusic.com/wwwroot/images/fb-issue-bug.jpg

  • 通过 FB 的重定向获取我页面中“网络”选项卡和所有 HTTPS 标头的快照。
  • 上图中的窗口显示了下面代码中的 var_dump:
    • 对于访问令牌,我只获得默认的组合 appId|secret。
    • 当我在 Facebook 的第一个联系点上 var_dump $_REQUESTS 时,我一无所获,所以我知道 codeigniter 没有剥离值,但我绝对没有从 Facebook 收到“signed_request”帖子!
  • 我有 85.1% 的把握确定我的 Facebook 应用程序设置正常。我在测试时进行了数十次调整和重置,但均未成功。
  • 当我使用浏览器哈希中的访问令牌将设置切换到客户端方法时,我确实得到了一个有效的令牌,但我拼命地试图避免我页面上的所有 javascript 并且无论如何都需要集成 php。
  • 所有这些只有在您批准该应用后才会发生,我可以在 Insights 中手动查找他们的会员资格,但知道他们在没有看到他们的令牌的情况下无法访问该应用。李>

自从我的 下面的原始帖子 4 月 24 日以来,我一直把这个错误放在一边:....

试错和研究已经 3 天了:

我的环境: LAMP 使用 facebook sdk 3 和 CodeIgniter 2

登录代码:

$CI->load->library('facebook', array("appId"=>APP_ID, "secret"=>APP_SECRET)); $this->visitor['access_token'] = $CI->facebook->getAccessToken(); $fb_id = $CI->facebook->getUser(); var_dump($CI->facebook); //见上图 var_dump($fb_id); // == 0 如果 ($fb_id && $fb_id > 0) { $temp = $CI->users->getUserByFb($fb_id); 如果 (!$temp) { $this->insertFBUser($fb_id); $this->visitor['redirect'] = "?prompt=newfb"; } 别的 { $this->visitor = array_merge($this->visitor, $temp); if (isset($this->visitor['user_allowed']) && $this->visitor['user_allowed'] == 0) { $CI->users->updateUser(array("user_allowed" => 1), $this->visitor['user_id']); } } } 别的 { array_push($this->errors, $CI->input->get_post("error_msg", false)); array_push($this->errors, $CI->input->get_post("error_code", false)); array_push($this->errors, $CI->input->get_post("error_reason", false)); array_push($this->errors, $CI->input->get_post("error", false)); array_push($this->errors, $CI->input->get_post("error_description", false)); if ($CI->input->get_post("autoclose", false) == true) { array_push($this->errors, "javascript stackoverflow 的编码很奇怪,但基本上改变了弹出窗口的标签,所以父页面会自动关闭它"); } var_dump($this->errors); 死(“纳达”); }

研究与调试:

  • 这篇文章也描述了我的问题,但解决方案不起作用:stackoverflow.com/questions/8587098/suddenly-getuser-became-to-return-0-php-3-1- 1-sdk 在此页面的 DROP_QUERY_PARAMS 数组中带或不带尾随逗号。

  • Facebook 不会在 url、帖子或会话中向我发送任何错误消息,并且可以正常抓取我的页面

  • 几天前一切正常,我对这段代码几乎没有改变。

  • 现在无论我使用 http 还是 https 登录都会失败

  • 弹出链接在以下位置打开:
    www.facebook.com/dialog/oauth?client_id=222912307731474&redirect_uri=https%3A%2F%2Ftrackauthoritymusic.com%2Fmanage%2Fusers%2Flogin%3Fautoclose%3Dtrue&state=4522cb9da5bf5107d690a22eee6c5a2e&scope=email&display=popup 同时具有状态和代码参数显然有效的:强> trackauthoritymusic.com/manage/users/login?autoclose=true&state=4522cb9da5bf5107d690a22eee6c5a2e&code=AQBfSkI4y_VxhCuF3coVvNmjetdGZjugyFv0UsLlKt5sR5MEGdY8KqpDXZKvqHTGaSHhzY4pHXuR_zmilkwmoQ5y6M9jh15GPI6DXz5E2fSBizAVlrlebriNGcNZb4DRaDFK8cxPJoa9xB2ERuimtuizmlZERNa8hwJxLXtztqkWWhkLFCaGjQvAyyf5jJRkuoztmvfKDIZz3W9lslM6fk_m

    LI>

但此时,sdk 无法获取任何访问令牌或 facebook 会话数据。

请帮忙!

【问题讨论】:

  • 为什么 redirect_uri/manage/users/login?autoclose=true - 我的意思是,你一定把它放在了自己的某个地方,对吧?这些参数听起来像是在建议您的系统销毁任何用户会话……并且在成功登录 Facebook 后立即这样做当然不会导致您想要的结果。
  • @CBroe:我设置了 redirect_uri = https%3A%2F%2Ftrackauthoritymusic.com%2Fmanage%2Fusers%2Flogin%3Fautoclose%3Dtrue (这有什么问题,因为它是 FQP)。 autoclose 参数对会话没有任何作用。它只是告诉我的应用程序,此请求在弹出窗口中。 “错误”输出基本上是 window.location.hash = "#close" 所以父窗口可以在成功或失败时自动关闭弹出窗口。

标签: facebook-php-sdk codeigniter-2


【解决方案1】:

我通过在 Facebook SDK 中使用 codeigniter 的输入库来解决此问题,以获取代码/令牌和所有 $_GET/$_POST/$_REQUEST 全局变量。

查看 facebook sdk 上的 git diff。我仍然不确定我做了什么来打破这个。 OAuth/Login 在某个时间点之前一直在工作。我确信这不仅仅是 codeigniter 偶尔清除全局变量的一些竞争条件

@@ -490,10 +490,11 @@
*/
   public function getSignedRequest() {
     if (!$this->signedRequest) {
-      if (!empty($_REQUEST['signed_request'])) {
-        $this->signedRequest = $this->parseSignedRequest(
-          $_REQUEST['signed_request']);
-      } elseif (!empty($_COOKIE[$this->getSignedRequestCookieName()])) {
+      $CI = & get_instance();
+      $signed_request = $CI->input->get_post("signed_request");
+      if (!empty($signed_request)) {
+        $this->signedRequest = $this->parseSignedRequest($signed_request);
+      } else if (!empty($_COOKIE[$this->getSignedRequestCookieName()])) {
         $this->signedRequest = $this->parseSignedRequest(
           $_COOKIE[$this->getSignedRequestCookieName()]);
       }
@@ -691,15 +692,18 @@
   protected function getCode() {
-    if (isset($_REQUEST['code'])) {
-      if ($this->state !== null &&
-          isset($_REQUEST['state']) &&
-          $this->state === $_REQUEST['state']) {
-
+    $CI = & get_instance();
+    $code = $CI->input->get_post("code");
+    if (!empty($code)) {
+      $state = $CI->input->get_post("state");
+      if ($this->state !== null && $state && $this->state === $state) {
         // CSRF state has done its job, so clear it
         $this->state = null;
         $this->clearPersistentData('state');
-        return $_REQUEST['code'];
+        return $code;
       } else {
         self::errorLog('CSRF state token does not match one provided.');
         return false;
        $params['access_token'] = $this->getAccessToken();
     }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-28
    • 1970-01-01
    • 2012-05-17
    • 2014-10-08
    • 1970-01-01
    • 2011-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多