【问题标题】:How to renew/extend facebook access tokens with PHP?如何使用 PHP 更新/扩展 facebook 访问令牌?
【发布时间】:2012-04-05 02:28:15
【问题描述】:

Facebook 已删除 offline_access 令牌功能,现在令牌必须在用户访问您的网站时更新以使其保持活跃。

假设某人已经授予您网站访问权限,并且您为他们存储了一个令牌。你会使用什么代码和 Facebook 的 PHP 库来更新这个令牌?

【问题讨论】:

  • 你用令牌做什么?如果您有足够的权限 - 您不需要检索和存储用户会话令牌,只需使用应用程序令牌
  • @zerkms 如果用户点击在我的网站上分享他的个人资料上的故事,那么我想使用 Ajax 将故事发布到他的 FB 个人资料上,而不必每次都将他重定向到 facebook .
  • 那么您只需要检索publish_stream 权限(developers.facebook.com/docs/authentication/permissions/…,请参阅说明)。只要你有它 - 你可以发布更新,没有用户的令牌
  • @zerkms 那么访问令牌的意义何在,它们现在有什么用途?
  • @zerkms,我迷失在 facebook api 文档中,所以也许你可以快速回答这个问题。你是说只要用户授权我的应用程序获得一组权限,如果我指定 APP,我不需要在我的 PHP API(获取或发布)调用 Facebook(在允许的权限集内)提供任何访问令牌ID和APP秘密?谢谢。

标签: php facebook


【解决方案1】:

您可以通过以下方式扩展您的令牌:

原始场景

  • 您的应用向用户请求权限
  • 您提示用户登录/授予权限
  • 您获得用户的令牌(短期令牌)并使用 grant_type=fb_exchange_token 通过 CURL 或其他方式交换 60 天
  • 你持久化令牌

现在您拥有该令牌,可以在 60 天内随心所欲地做任何事。最多,因为用户可以更改密码,取消授权应用程序等,令牌将失效。扩展令牌可以做的是每次用户访问您的页面,您可以检查他们是否通过 javascript 登录,如果是,则对您的服务器进行 ajax 调用以将现有令牌延长 60 天今天。您可以拨打任意数量的电话,只有第一个有效。这是我的做法:

  1. 在加载事件期间,在您的页面某处添加如下内容:

     FB.getLoginStatus(function (response) {
         if (response.status === 'connected') {
            $.ajax({
                type: "POST",
                async: false,
                url: YOUR_URL,
                dataType: "text",
                data: {token  : response.authResponse.accessToken }
             });
         }
     });
             //rest of jquery ajax call here
    

这将为用户获取一个新的客户端访问令牌并将其发送到服务器

  1. 然后,服务器可以获取该令牌并将其交换为 60 天

    $token_url = "https://graph.facebook.com/oauth/access_token?client_id=".FACEBOOK_CLIENT_ID."&client_secret=".FACEBOOK_SECRET."&grant_type=fb_exchange_token&fb_exchange_token=".$token;
    
    $c = curl_init();
    curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($c, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($c, CURLOPT_URL, $token_url);
    $contents = curl_exec($c);
    $err  = curl_getinfo($c,CURLINFO_HTTP_CODE);
    curl_close($c);
    
    $paramsfb = null;
    parse_str($contents, $paramsfb);        
    

参考:

https://developers.facebook.com/roadmap/offline-access-removal/

如果用户在 60 天内返回您的网站,这只会延长令牌。如果没有,您将需要再次提示权限。

【讨论】:

  • 感谢您的回答。除了使用 CURL,难道没有办法使用他们提供的 Facebook 自己的类来做到这一点吗?
  • @Click Upvote,可能但我尝试使用 FB 类并执行 api->('/oauth/access_token, 'get', $data) 和各种排列,但由于某种原因不是取回任何数据。没来得及弄清楚卷曲被骗了。 FB 类也做 CURL,所以我确信这只是我的一些语法错误。如果你弄明白了,请告诉我 :) 我将不胜感激
  • Facebook PHP SDK (v.3.2.2) 有一个方法可以实现:Base_Facebook::setExtendedAccessToken()
【解决方案2】:

更新

是的,@zerkms 是对的,如果应用程序有权限,则不需要 access_token。

With this permission, you can publish content to a user's feed at any time. However, please note that Facebook recommends a user-initiated sharing model. Please read the Platform Policies to ensure you understand how to properly use this permission. Note, you do not need to request the publish_stream permission in order to use the Feed Dialog, the Requests Dialog or the Send Dialog.

所有扩展权限都有类似的权限:https://developers.facebook.com/docs/authentication/permissions/

【讨论】:

  • “您需要让用户在 60 天内重新进行身份验证才能获取新令牌。” - - 不。只要有 publish_stream 允许 - 你永远不需要用户的令牌。直到用户从应用程序列表中删除应用程序 - 您可以发布消息,即使 100 年后也是如此。所以,不,没有理由在应用程序密钥和秘密之外保留任何令牌
  • 只是回答我的问题,我如何更新令牌,这不是关于流发布
  • 您通过让人们再次通过身份验证过程来更新令牌。您不能自动更新令牌,否则在它们上设置到期日期有什么意义。
【解决方案3】:

这是我目前正在做的事情

public function setExtendAccessToken($accessToken = NULL) {

enter code here
    if(!$accessToken) return;

    $graphUrl = 'https://graph.facebook.com/oauth/access_token?client_id='.$facebookAppId.
                '&client_secret='.$facebookSecret.
                '&grant_type=fb_exchange_token&fb_exchange_token='.$accessToken;
    $accessToken = @file_get_contents($graphUrl);
    parse_str($accessToken); //get the access_token param in the string and would be named $access_token
    if(!$access_token) $access_token = $accessToken; //if cannot be extended then just return the access token with 2 hours expiry
    return $access_token;
}

【讨论】:

  • 试过这个......它确实提供了与传递的不同的令牌,但发布日期和到期日期相同(使用 fb 调试器)。只是以为其他人会想知道。
  • @ppetree 也许您正在尝试重新扩展已经扩展的访问令牌?每次用户进行身份验证时,我通常都会将新的访问令牌传递给此函数。
  • 问题是,扩展令牌应该在 60 天内到期,我不希望用户必须重新验证......这似乎很荒谬。在我的情况下,用户在我的网站上发帖,而我们代表他们在 fb 上发帖和发推文。
【解决方案4】:
use Facebook\FacebookSession;
use Facebook\GraphSessionInfo;
use Facebook\FacebookRequest;
use Facebook\GraphUser;
use Facebook\FacebookRequestException;
use Facebook\FacebookRedirectLoginHelper;

    FacebookSession::setDefaultApplication('YOURAPPID', 'SECRET');

    $user_accessToken = $_COOKIE['access_token_facebook']

    $session = new FacebookSession($user_accessToken);

    try {
        $session->validate();
    } catch (FacebookRequestException $ex) {
        // When Facebook returns an error
        echo $ex->getMessage();
    } catch (\Exception $ex) {
        // When validation fails or other local issues
        echo $ex->getMessage();
    }
    if ($session) {
        // Exchange token for long token
        $longToken = $session->getExchangeToken();
        // ... your other stuff
    }

参考: https://developers.facebook.com/docs/facebook-login/access-tokens#pagetokens https://developers.facebook.com/docs/facebook-login/access-tokens#extending

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-13
    • 2012-06-10
    • 2012-03-30
    • 1970-01-01
    • 2012-02-29
    • 2012-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多