【问题标题】:How do you get long-lived access tokens from the Facebook Graph API (server-side auth)?如何从 Facebook Graph API(服务器端身份验证)获取长期访问令牌?
【发布时间】:2012-09-10 15:57:46
【问题描述】:

由于 Facebook 正在删除 offline_access 权限,我想继续迁移我们的网站以使用新系统。

我在 Facebook 的网站上找到了这份文件: https://developers.facebook.com/roadmap/offline-access-removal

但是,当我使用服务器端身份验证处理某人时,我会收到以下响应:

access_token => BLAHBLAHBLAHdontusemytokensilly
expires => 4992

当我尝试使用访问点(在该文档上)将访问令牌延长几个小时以上时,我得到了回复:

access_token => BLAHBLAHBLAHdontusemytokensilly
expires => 4990

根据该文档,服务器端 OAuth 应该获得一个持续 60 天的令牌,我不明白为什么我没有拿回来。

我真的不想每 2 小时通过 OAuth 重定向发送我们的用户。

有什么想法吗?谢谢!

更新

根据要求,这是我正在使用的流程(在浏览器中):

首先我将用户重定向到这里:

https://www.facebook.com/dialog/oauth?client_id=BLAHBLAH&redirect_uri=http%3A//localhost/user-social/facebook/redirect&scope=user_about_me%2Cuser_events%2Cuser_interests%2Cuser_likes%2Cfriends_likes%2Cuser_location%2Cuser_status%2Cuser_subscriptions%2Cfriends_subscriptions%2Cemail%2Ccreate_event%2Cpublish_stream%2Crsvp_event%2Cpublish_actions%2Cuser_actions.music%2Cfriends_actions.music%2Cuser_actions.news%2Cfriends_actions.news%2Cuser_actions.video%2Cfriends_actions.video%2Cmanage_pages

这会将用户重定向到这里:

http://localhost/user-social/facebook/redirect?code=BLAHBLAHBLAHsomeawesomecode#_=_

然后我请求了一个访问令牌,如下所示:

https://graph.facebook.com/oauth/access_token?client_id=BLAHBLAH&redirect_uri=http%3A//localhost/user-social/facebook/redirect&client_secret=BLAHBLAHsomeawesomesecret&code=BLAHBLAHBLAHsomeawesomecode

我从 Facebook 收到这个休息:

access_token=BLAHBLAHBLAHdontusemytokensilly&expires=4057

这显然是一个短暂的令牌。 根据 Facebook 文档(上图),我应该收到一个长期存在的令牌(因为我使用的是服务器端 OAuth)。

但是,由于它是短暂的,我试图用它来换取一个长寿的代币:

https://graph.facebook.com/oauth/access_token?client_id=BLAHBLAH&redirect_uri=http%3A//localhost/user-social/facebook/redirect&client_secret=BLAHBLAHsomeawesomesecret&grant_type=fb_exchange_token&fb_exchange_token=BLAHBLAHBLAHdontusemytokensilly

这是 Facebook 返回的内容:

access_token=BLAHBLAHBLAHdontusemytokensilly&expires=3967

两个请求都返回相同的 access_token。

更新 2

我将上面的访问令牌放入Facebook Debugger,这就是它返回的内容:

App ID: 
BLAHBLAH
User ID:    
211800900 : David Barratt
Issued: 
Unknown
Expires:    
1347303600 (in 40 minutes)
Valid:  True
Origin: Web
Scopes: create_event create_note email friends_actions.music friends_actions.news friends_actions.video friends_likes friends_subscriptions manage_pages photo_upload publish_actions publish_stream rsvp_event share_item status_update user_about_me user_actions.music user_actions.news user_actions.video user_events user_interests user_likes user_location user_status user_subscriptions video_upload

更新 3

删除我的所有权限并重新授权应用程序后(如@phwd 建议的那样)。 Facebook API 返回:

access_token=BLAHBLAHBLAHdontusemytokensilly

这是否意味着我已经返回了长期存在的 access_token?如果有,过期时间在哪里?

更新 4

当我通过 Facebook 调试器运行上述 access_token 时,我得到以下结果:

App ID: 
BLAHBLAH
User ID:    
211800900 : David Barratt
Issued: 
1347309538 (39 minutes ago)
Expires:    
Never
Valid:  True
Origin: Web
Scopes: create_event create_note email friends_actions.music friends_actions.news friends_actions.video friends_likes friends_subscriptions manage_pages photo_upload publish_actions publish_stream rsvp_event share_item status_update user_about_me user_actions.music user_actions.news user_actions.video user_events user_interests user_likes user_location user_status user_subscriptions video_upload

这似乎解决了最初的问题,但奇怪的是 access_tokens 是无限期的,而不是规定的 60 天。

关于为什么会出现这种情况的任何想法?

【问题讨论】:

    标签: facebook facebook-graph-api oauth facebook-oauth


    【解决方案1】:

    不确定你是否知道。但无论用户登录您的应用程序多少次,访问令牌每天只会更新一次。

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

    【讨论】:

    • 这无关紧要,因为长期访问令牌应该持续 60 天(我发布的问题说它只持续几个小时)。
    【解决方案2】:

    由于 Facebook 正在删除 offline_access 权限,我想继续迁移我们的网站以使用新系统。

    确保您在应用的高级设置中启用了“删除offline_access 权限”

    如果你这样做了,你可能会遇到错误https://developers.facebook.com/bugs/378106708911903

    【讨论】:

    • 我可以确认“删除offline_access权限”设置为“启用”。
    • 另外,这不是一个画布应用程序,这是一个网站,所以我不确定这个错误是否适用。
    • @DavidBarratt 您是否已使用HTTP DELETE /me/permissions 撤销权限并重试,那么它可能不仅限于画布应用。
    • 删除我的所有权限后授权。 Facebook 根本不会返回过期时间。我假设这意味着我已经收到了长期存在的令牌?
    • @DavidBarratt 可以调试确认developers.facebook.com/tools/debug
    猜你喜欢
    • 2012-06-05
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    • 2016-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多