【问题标题】:Is there a way to check if Facebook access token is still valid?有没有办法检查 Facebook 访问令牌是否仍然有效?
【发布时间】:2011-04-20 04:44:38
【问题描述】:

我的网站使用终身访问令牌 (offline_access)。但是,如果用户更改了他/她的密码,访问令牌将被重置。在调用 Graph API 之前,是否有一种方法可以检查当前访问令牌是否有效?感谢您的宝贵时间。

【问题讨论】:

标签: facebook facebook-graph-api facebook-rest-api


【解决方案1】:

离线 - 不可能

询问该用户是否已授予权限:

https://graph.facebook.com/{facebook-id}/permissions?access_token={access-token}

如果访问令牌无效,则会报错:

{  
   error:{  
      message:"The access token could not be decrypted",
      type:"OAuthException",
      code:190
   }
}

否则它将给出用户已授予的权限列表:

data:[  
   {  
      installed:1,
      ...... permission list......... 
      bookmarked:1
   }
]

【讨论】:

    【解决方案2】:

    我浏览了这些帖子,但我发现了像这样的非常好的解决方案:

    GET graph.facebook.com/debug_token?
        input_token={token-to-inspect}
        &access_token={app_id}|{app_secret}
    

    此请求的响应为您提供所需的一切:

    • 您的应用 ID - 验证令牌来自您的应用
    • 应用程序名称 - 也可以检查
    • expires_at - 令牌过期时间
    • is_valid - 用于检查的布尔值
    • user_id - 您也可以比较和检查

    请注意“|”标志必须以字母的形式出现

    【讨论】:

      【解决方案3】:

      基本上,FB 希望您对其进行轮询,或检测案例并重定向用户以进行重新验证。烦人,但官方:

      (旧链接。见下文) https://developers.facebook.com/blog/post/500/

      编辑:Facebook 改变了他们的链接结构,没有重定向。并不惊讶。

      https://developers.facebook.com/blog/post/2011/05/13/how-to--handle-expired-access-tokens/

      【讨论】:

      • 对不起,您点击的链接可能已损坏,或者该页面可能已被删除。
      • +1 表示“不惊讶”的评论。 :) “快速行动,打破常规”对于 Facebook 公司来说可能是一个很棒的理念,但它确实让我们的生活变得艰难......
      • @rinogo 你偷了我的评论!我也喜欢“不惊讶”部分的这个答案。我讨厌FB。这是一个真正的痛苦。 :|
      【解决方案4】:

      随着自 OP 以来事情发生变化而更新此内容:

      您可以在此处调试访问令牌:https://developers.facebook.com/tools/debug/accesstoken?version=v2.5&q={access_token}

      【讨论】:

        【解决方案5】:
                //When user access token expires user must be logged in and renew the access token him self.it is a Facebook policy 
                //you can overcome this by sending email to users who have expired access token.
                //create a table of successful sending to monitor sending process
                //if any failure happened with the user an email is sent to him to ask him to activate there account again.with a link to your subscription page.
                //and here is the code should be written on that page. 
                 $app_id = "YOUR_APP_ID";
                 $app_secret = "YOUR_APP_SECRET"; 
                 $my_url = "YOUR_POST_LOGIN_URL";
        
                // known valid access token stored in a database 
                $access_token = "YOUR_STORED_ACCESS_TOKEN";
        
                $code = $_REQUEST["code"];
        
               // If we get a code, it means that we have re-authed the user 
               //and can get a valid access_token. 
               if (isset($code)) {
                 $token_url="https://graph.facebook.com/oauth/access_token?client_id="
                   . $app_id . "&redirect_uri=" . urlencode($my_url) 
                   . "&client_secret=" . $app_secret 
                   . "&code=" . $code . "&display=popup";
                 $response = file_get_contents($token_url);
                 $params = null;
                 parse_str($response, $params);
                 $access_token = $params['access_token'];
               }
        
        
               // Attempt to query the graph:
               $graph_url = "https://graph.facebook.com/me?"
                 . "access_token=" . $access_token;
               $response = curl_get_file_contents($graph_url);
               $decoded_response = json_decode($response);
        
               //Check for errors 
               if ($decoded_response->error) {
               // check to see if this is an oAuth error:
                 if ($decoded_response->error->type== "OAuthException") {
                   // Retrieving a valid access token. 
                   $dialog_url= "https://www.facebook.com/dialog/oauth?"
                     . "client_id=" . $app_id 
                     . "&redirect_uri=" . urlencode($my_url);
                   echo("<script> top.location.href='" . $dialog_url 
                  . "'</script>");
                }
                else {
                  echo "other error has happened";
                }
              } 
              else {
              // success
                echo("success" . $decoded_response->name);
                echo($access_token);
              }
        
              // note this wrapper function exists in order to circumvent PHP's 
              //strict obeying of HTTP error codes.  In this case, Facebook 
              //returns error code 400 which PHP obeys and wipes out 
              //the response.
              function curl_get_file_contents($URL) {
                $c = curl_init();
                curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
                curl_setopt($c, CURLOPT_URL, $URL);
                $contents = curl_exec($c);
                $err  = curl_getinfo($c,CURLINFO_HTTP_CODE);
                curl_close($c);
                if ($contents) return $contents;
                else return FALSE;
              }
        

        【讨论】:

          【解决方案6】:

          【讨论】:

          • 虽然 Chaitanya Bharat 的答案更简单,并且在大多数情况下效果很好,但这种方法似乎对我来说是最好的。
          • 什么是输入令牌?
          【解决方案7】:

          如果您想知道令牌的到期时间,您可以使用 appid 和令牌传递一个开放的图形 url,如下所示。

          https://graph.facebook.com/oauth/access_token_info?client_id=APPID&access_token=xxxxxxxxx
          

          【讨论】:

          • 这里的client_id 参数什么都不做。你可以忽略它。
          【解决方案8】:

          Otto 对 facebook 帖子的回答似乎是对这个问题的官方回应,但是它使用直接 PHP 而不是 SDK,并且还使用 JS 来解决问题而不是 PHP。如果您使用 PHP 来检查有效会话,您通常需要一种 PHP 方法来确保有效会话才能继续。

          以下代码使用图形 API 检查 me 对象。如果抛出异常,它会破坏*当前的 Facebook 会话。

          try{
              $facebook->api('/me');
          }
          catch( FacebookApiException $e ){
              $facebook->destroySession();
          }
          

          这会强制稍后的图形调用实例化一个新的 Facebook 会话。这至少使您可以访问公共数据,以便您可以呈现页面不需要 FB 用户权限:

          $facebook->api('/userName');
          

          要重新获得用户权限访问,用户需要登录您的应用程序(这与登录 Facebook 本身不同)。您可以使用 JS 或 PHP 来做到这一点:

          $facebook->getLoginUrl();
          

          *请注意,destroySession() 调用尚未在 PHP SDK 的标记版本中。使用主分支或对其进行修补。

          【讨论】:

            【解决方案9】:

            实时更新可以让您解决这个问题,但它会相当复杂。基本上,您可以订阅更新,这些更新会告诉您 1) 用户是否删除了应用程序或 2) 用户是否删除了权限。您可以使用它来存储 facebook 用户的当前权限。这样,如果用户删除了您的应用,您就会知道访问令牌已过期。

            实时更新实际上是 facebooks 推荐的处理权限的方式。许多应用程序在每次加载页面时都会调用 api 来检查权限。这往往是缓慢且不可靠的。

            【讨论】:

            • 当用户更改密码时会怎样?
            【解决方案10】:

            离线,不向 facebook 发送任何内容 - 我不这么认为。最简单的方法可能是发送请求到:

            https://graph.facebook.com/me?access_token=...
            

            Facebook 还支持订阅real-time 更新,但我不确定如何将它们应用于这种情况。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-05-16
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-11-09
              • 2016-04-18
              • 1970-01-01
              • 2020-06-05
              相关资源
              最近更新 更多