如何从Facebook Graph API(服务器端身份验证)获取长期访问令牌?

5

因为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

我将上述access token放入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 Debugger运行上述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天而是无限期。
你有任何想法为什么会这样?
2个回答

2

2
这个问题并不相关,因为长期访问令牌应该持续60天(我发布的问题说它只持续几个小时)。 - David Barratt

1
由于Facebook正在删除offline_access权限,我想继续将我们的网站迁移到使用新系统。
请确保在您的应用程序的高级设置中启用了“删除offline_access权限”。

Advanced settings

如果您是这样做的,可能会遇到一个错误https://developers.facebook.com/bugs/378106708911903


我可以确认“移除offline_access权限”已设置为“启用”。 - David Barratt
此外,这不是一个画布应用程序,而是一个网站,所以我不确定这个 bug 是否适用。 - David Barratt
在删除了所有权限并重新授权后,Facebook根本没有返回到期时间。我认为这意味着我已经收到了长期访问令牌? - David Barratt
@DavidBarratt 你可以通过调试来确认 https://developers.facebook.com/tools/debug - phwd
令人奇怪的是令牌从未过期。 - David Barratt
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接