从 Facebook 获取长期访问令牌

Posted

技术标签:

【中文标题】从 Facebook 获取长期访问令牌【英文标题】:Get long live access token from Facebook 【发布时间】:2012-05-15 02:04:55 【问题描述】:

据我了解,最近 Facebook 已决定删除 offline_access 权限,并引入了一个称为长寿命访问令牌的概念,最长可使用 60 天。有谁知道如何使用 Facebook javascript SDK 获取此访问令牌?

【问题讨论】:

【参考方案1】:

有一种方法可以将其延长至 60 天。此处描述:https://developers.facebook.com/docs/roadmap/completed-changes/offline-access-removal/ 下Scenario 4: Client-side OAuth and Extending Access_Token Expiration Time through New Endpoint

编辑: 为了扩展访问令牌,您需要使用短期访问令牌发出以下请求:

https://graph.facebook.com/oauth/access_token?             
    client_id=APP_ID&
    client_secret=APP_SECRET&
    grant_type=fb_exchange_token&
    fb_exchange_token=EXISTING_ACCESS_TOKEN 

【讨论】:

当我当前的访问令牌在 60 天后每次到期时,我是否需要交换我当前的 access_token 以获得新的访问令牌。现在,当我将 offline_access 作为 scop 参数传递时,似乎它没有考虑它,只是我的访问令牌在几个小时内就失效了。你能解释一下我是如何通过 facebook JavaScript sdk 获得长期访问令牌的吗?是否有任何设置或特殊参数需要我一起发送。 您无法使用 js sdk 获得 60 天访问令牌。您只能在先收到短期访问令牌后将其延长至 60 天。 有没有办法在没有用户交互的情况下再次延长这 60 天? 请注意,根据developers.facebook.com/docs/facebook-login/access-tokens,由于此请求发送 APP_SECRET(并检索长期用户令牌),因此不应在客户端完成,而应在服务器上完成。 @Excaliber:将 APP_SECRET 作为获取参数发送仍然有点风险。它在路线中可见,并且可以存储在访问日志中。作为 post 参数发送会更好。由于这是一个 https 调用,因此它将被加密。由于同源/跨域规则,也许 facebook 以这种方式实现它。如果他们把它放在他们的服务器端 SDK 中会很好。【参考方案2】:

由于 Facebook 中的一个错误,一些用户必须在 Facebook 发布长期令牌之前取消对应用的授权。

【讨论】:

已确认。在我的头撞到屏幕上 7 小时后,从我的帐户中删除了该应用程序,并返回了长寿令牌。 即使客户端密码正确,这是否是“验证客户端密码错误”错误?【参考方案3】:

我刚刚使用“axios”进行了 Facebook Graph API 调用。您可以从 App Dashboard 中找到 client_id 和 client_secret。

getLongLiveToken = () => 
    window.FB.getLoginStatus(function(response) 
        if (response.status === 'connected') 
            let userAccessToken = response.authResponse.accessToken;
            axios.get(`https://graph.facebook.com/oauth/access_token?client_id=$clientId&client_secret=$clientSecret&grant_type=fb_exchange_token&fb_exchange_token=$userAccessToken`)
            .then((response) => 
                console.log("Long Live Access Token");
                console.log(response.data.access_token);
             );
           
       );
    
<button onClick= () => this.getLongLiveToken()  >Long Live Token</button>

【讨论】:

【参考方案4】:

将函数添加到 javascript 中,并提供以下详细信息:我希望它对你有用。

function getLongLiveToken(data)

        FB.api('oauth/access_token', 
            client_id: data.client_id, // FB_APP_ID
            client_secret: data.secret, // FB_APP_SECRET
            grant_type: 'fb_exchange_token',
            fb_exchange_token: data.access_token // USER_TOKEN
        , function (res) 
            if(!res || res.error) 
                console.log(!res ? 'error occurred' : res.error);
            else
                var accessToken = res.access_token;
                if(typeof accessToken != 'undefined')
                
            
        );
    

【讨论】:

不要从客户端进行调用,将短令牌发送到服务器并在后端使用此类东西,因为它包含应用程序机密。 你能告诉我吗!!!您更喜欢哪种编程语言。 后端随便用什么,我个人用python。

以上是关于从 Facebook 获取长期访问令牌的主要内容,如果未能解决你的问题,请参考以下文章

通过Console App C#将照片发布到Facebook页面

反应原生 fbsdk 我如何通过服务器获得长期访问令牌

从 Facebook Graph API 获取访问令牌

从授权中获取 facebook 令牌访问权限

使用没有访问令牌的 Facebook Graph API 获取公共页面状态

自动进行Facebook页面访问令牌生成