Facebook的Oauth 2.0访问令牌会过期吗?

126

我在尝试使用Facebook的Oauth 2.0授权,并想知道Facebook发放的访问令牌是否会过期。如果会过期,是否有请求长期访问令牌的方法?


4
补充一些关于这个问题的细节:即使用户更改了他/她的 Facebook 密码,即使是 offline_access 也会被使无效。因此,如果您在使用旧的访问令牌时出现错误,最好采取安全措施并重新获取新的访问令牌。 - Hoàng Long
2
添加参考链接:https://developers.facebook.com/blog/post/500/ - Hoàng Long
2
你们好啊,你们都真的很棒。无论问题是什么,我都能够解决它...谢谢你们。 - vinay
3
看起来Facebook将于5月1日弃用offline_access权限。在未来,所有的访问令牌都会在“到期时间”(60天)到期后失效,或者当用户更改密码、取消授权你的应用程序或注销时也会失效。[API]。顺便说一句,如果访问令牌在注销时仍然会过期(用户通常会在60天内注销),我不确定为什么Facebook要将新的“过期时间”设置为60天。也许我有所遗漏... [expiration] - Steven Wexler
1
access_token的行为正在发生变化,您应该查阅2012年7月的“重大变更”——offline_access权限将被弃用,而access_token将具有长寿命。 - qodeninja
13个回答

64

经过一番搜索,我找到了答案。以下是答案:

更新 (2018年4月11日)

  • 令牌将在约60天后过期。
  • 当使用您的应用程序的人向Facebook服务器发出请求时,每天刷新一次令牌,最多可刷新90天。
  • 所有访问令牌都需要在使用您的应用程序的人的同意下每90天更新一次。

Facebook更改公告(2018年4月10日)

Facebook更新的令牌过期页面(2018年4月10日)

offline_access: 允许您的应用程序随时代表用户执行授权请求。 默认情况下,大多数访问令牌在短时间内过期,以确保应用程序仅在用户积极使用应用程序时代表用户发出请求。 此权限使我们的OAuth终点返回的访问令牌具有长寿命。

这是一个请求的权限值。

http://developers.facebook.com/docs/authentication/permissions

更新

offline_access权限已经被删除了一段时间。

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


2
作为回应,我开始了一个开源库,可能对你们有所帮助。这是一个oAuth库,旨在支持所有具有oAuth实现的社交网络。它已经支持扩展权限,包括离线发布。https://code.google.com/p/socialoauth/ - Tendrid
即使是离线访问令牌,如果用户在Facebook上更改了密码,也会过期。 - Bemmu
很遗憾,这不是解决问题的“干净”方案。首先,请求此权限会提醒用户有额外的权限(例如,此应用程序将随时能够访问您的Facebook帐户),这会让很多潜在客户失去兴趣。其次,如果用户更改密码,此令牌将无效。因此,需要有更好的方法(例如,刷新令牌)来获取新的access_token,特别是对于富客户端Ajax驱动的Web应用程序。 - Vladimir
24
根据他们的api文档,从2012年5月2日起将不再支持offline_access。 - Ben Lesh
@Tendrid 你的库只支持Facebook和Twitter。 - mareoraft

30

你可以尝试这个,也许会对你有所帮助。

https://graph.facebook.com/oauth/authorize?
    client_id=127605460617602&
scope=offline_access,read_stream,user_photos,user_videos,publish_stream&
    redirect_uri=http://www.example.com/
为获取终身访问令牌,您需要使用scope=offline_accessscope=offline_access的含义是:
启用应用程序代表用户在任何时间执行授权请求。默认情况下,大多数访问令牌在短时间段后过期,以确保应用程序仅在用户积极使用应用程序时代表用户进行请求。此权限使OAuth端点返回的访问令牌长寿命。
但根据Facebook未来的升级计划,从2012年10月3日起,将永久停用离线访问功能。用户将获得60天的长寿命周期访问令牌,在访问令牌到期之前,Facebook会通知您,或者您可以通过从Facebook API获取到期值来获得自定义通知功能。

10
我想告诉你,fb已经改变了它的API,现在不再提供终身令牌,现在离线访问将持续60天。请注意更新。 - PrateekSaluja

20

17

我和提问者有着相同的问题,但是建议使用offline_access的答案让我产生了警惕。

从安全角度来看,获取用户 Facebook 帐户的离线访问权限与仅使用 Facebook 进行单点登录相比质量上不同且更加强大,并且不应轻易使用(除非你真的需要它)。当用户授权此权限时,“应用程序”可以随时随地检查用户帐户。 我在引号中放置“应用程序”,因为实际上可以使用具有凭据的任何工具 - 您可以编写一整套与 Web 服务器无关的工具,可以访问用户同意共享的任何信息。

我不会使用此功能来解决短令牌寿命问题;这不是其预期用途。实际上,令牌生存期本身就是一项安全功能。我仍在寻找有关这些令牌的正确使用方式的详细信息(我可以将它们持久化吗?我该如何/应该如何保护它们?Facebook 是否嵌入了 OAuth 2.0 的“刷新令牌”在主令牌中?如果没有,在哪里以及/或如何刷新?),但我很确定 offline_access 不是正确的方式。


1
同样的疑惑,David。你有没有找到更多关于如何保护离线访问存储的令牌的信息? - neal aise
Facebook的文档很糟糕,但我认为情况是这样的:持久化未使用offline_access获取的访问令牌相对安全。虽然任何人(在FB用户仍然登录时)可以执行用户授权您的任何操作,但并不那么糟糕,因为一旦用户在任何地方退出Facebook,令牌就会失效。这仍然是一个安全漏洞(我觉得你不必在/me请求中提供应用程序密钥很奇怪),但它并不是无限制的。如果有人更好地理解了这个问题,请随时纠正我。 - David Pope

8

是的,它们会过期。与“access_token”一起传递的“expires”值,据我所知,大约为2小时。我一直在搜索,但我没有找到请求更长过期时间的方法。


3
如果您请求“offline_access”权限,令牌将不会过期。 - Brendan Berg
1
@Brendan:但是一旦用户更改了他/她的Facebook密码,它将被使无效。 - Hoàng Long
@HoàngLong 有任何相关的参考资料吗? - Charles Prakash Dasari

6

4
每次用户通过Facebook登录您的网站时,您都可以刷新用户的访问令牌。 离线访问无法保证您获得终身的访问令牌,当用户撤销您的应用程序访问权限或更改密码时,访问令牌会发生变化。
引用自Facebook http://developers.facebook.com/docs/authentication/ 注意:如果应用程序没有请求offline_access权限,则访问令牌是有时间限制的。时间限制的访问令牌也会在用户退出Facebook时失效。如果应用程序已经从用户那里获取了offline_access权限,则访问令牌不会过期。但是,每当用户更改密码时,它就会失效。
假设您在数据库中的用户表中存储了用户的Facebook uid和访问令牌,每次用户点击“使用Facebook登录”按钮时,您都可以使用Facebook Javascript API检查登录状态,然后从响应中检查连接状态,如果用户已连接到您的网站,则可以更新表中的访问令牌。

3

点击此按钮,将一个短期访问令牌转换为长期/不过期(页面)的访问令牌:

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 

1

登录Facebook账户并编辑您的应用设置(账户->应用程序设置->使用您的帐户的附加权限)。 取消选中权限(访问我不使用应用程序时的数据(offline_access))。然后,当您登录应用程序时,Facebook会发布一个新令牌。


1
基本上,Facebook令牌会在一个小时左右过期。但是您可以使用“交换”令牌获取长期有效的令牌。 https://developers.facebook.com/docs/facebook-login/access-tokens
GET /oauth/access_token?  
    grant_type=fb_exchange_token&           
    client_id={app-id}&
    client_secret={app-secret}&
    fb_exchange_token={short-lived-token} 

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