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

Posted

技术标签:

【中文标题】Facebook Oauth 2.0 访问令牌会过期吗?【英文标题】:Do Facebook Oauth 2.0 Access Tokens Expire? 【发布时间】:2011-02-10 21:07:15 【问题描述】:

我正在使用 Facebook 中的 Oauth 2.0 授权,并且想知道 Facebook 传递的访问令牌是否会过期。如果是这样,有没有办法请求长期访问令牌?

【问题讨论】:

为这个问题添加一些细节:当用户​​更改他/她的 Facebook 密码时,即使是 offline_access 也会失效。因此,如果您在使用旧的访问令牌时收到错误,最好谨慎行事并重新获取新的访问令牌。 添加参考:developers.facebook.com/blog/post/500 伙计们,你们都只是摇滚。不管问题是什么,我都解决了...谢谢大家 Facebook 似乎在 5 月 1 日弃用了 offline_access 权限。将来,当“过期时间”(60 天)用完、用户更改密码、用户取消对您的应用程序的授权或用户注销时,所有访问令牌都将过期。 API。附言如果访问令牌在注销时仍会过期(似乎用户倾向于在 60 天内注销),我不确定为什么 Facebook 将新的“过期时间”设置为 60 天。也许我错过了什么...expiration access_token 的行为现在正在发生变化,您应该查看 2012 年 7 月的“重大变更”——offline_access 权限正在被弃用,access_token 的生命周期将会很长。 【参考方案1】:

经过一番挖掘,我找到了这个。这似乎是答案:

更新(2018 年 4 月 11 日)

令牌将在大约 60 天后过期。 当使用您的应用的人向 Facebook 的服务器发出请求时,令牌将每天刷新一次,最长持续 90 天。 所有访问令牌需要每 90 天更新一次,并征得使用您应用程序的人的同意。

Facebook change announce (10/04/2018)

Facebook updated token expiration page (10/04/2018)

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

它是一个请求的权限值。

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

更新

offline_access 权限已在不久前被删除。

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

【讨论】:

针对这个问题,我创建了一个开源库,可能对你们有些用处。它是一个 oAuth 库,旨在通过 oAuth 实现支持所有社交网络。它已经支持包括离线发布在内的扩展权限。 code.google.com/p/socialoauth 如果用户在 Facebook 上更改密码,即使 offline_access 令牌也会过期。 不幸的是,它不是解决手头问题的“干净”解决方案。首先或全部请求此权限会提醒用户额外权限(例如,此应用程序将能够随时访问您的 Facebook 帐户),这会关闭很多潜在客户。其次,如果用户更改了他的密码,此令牌将无效。因此需要有更好的方法(例如刷新令牌)来获取新的 access_token,尤其是对于富客户端 ajax 驱动的 Web 应用程序。 根据他们的api documentationoffline_access,自 2012 年 5 月 2 日起将不再支持。 @Tendrid 您的图书馆仅支持 Facebook 和 Twitter。【参考方案2】:

试试这个可能对你有帮助

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_access

scope=offline_access 的意思是:-

使您的应用程序能够代表代表执行授权请求 用户随时。默认情况下,大多数访问令牌在 短时间确保应用程序仅代表提出请求 当用户正在积极使用应用程序时。这 权限使我们的 OAuth 端点返回访问令牌 长寿。

但根据 facebook 未来的升级,offline_acees 功能将从 2012 年 10 月 3 日起永久弃用。 并且用户将获得 60 天的长期访问令牌,并且在访问令牌到期之前 Facebook 会通知您,或者您可以让您的自定义通知功能从 Facebook Api 获取到期值。

【讨论】:

我想通知您,fb 的 api 已更改,现在没有可用的生命周期令牌,现在离线访问将激活 60 天。【参考方案3】:

请注意,Facebook 现在弃用了 offline_access 权限,转而支持您可以请求“升级”到到期的令牌。我自己正在处理这个问题,所以我没有更多要说的,但是这个文档可能会有所帮助:

https://developers.facebook.com/docs/offline-access-deprecation/

【讨论】:

【参考方案4】:

我带着与 OP 相同的问题来到这里,但建议使用 offline_access 的答案对我来说是个危险信号。

在安全方面,离线访问用户的 Facebook 帐户与仅使用 Facebook 进行单点登录相比,在性质上有所不同,而且功能强大得多,因此不应轻易使用(除非您真的需要它)。当用户授予此权限时,“应用程序”可以随时随地检查用户的帐户。我将“应用程序”放在引号中,因为它实际上是任何具有凭据的工具——您可以编写一整套与 Web 服务器无关的工具,这些工具可以访问用户同意与这些服务器共享的任何信息凭据。

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

【讨论】:

大卫也有同样的疑问。您是否找到了有关如何保护存储以供离线访问的令牌的更多信息? Facebook 的文档很糟糕,但我认为的情况是,保留未通过offline_access 获取的访问令牌是相当安全的。虽然确实可以访问它的任何人(当 FB 用户仍然登录时)可以做任何用户已授予您权限的事情,但这并没有那么糟糕,因为一旦用户退出 facebook,令牌就会失效任何地方。这仍然是一个安全漏洞(我觉得很奇怪,您不必在 /me 请求中提供您的应用程序机密),但它不是开放式的。如果有人对此感到更好,请随时纠正我。【参考方案5】:

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

【讨论】:

如果您请求 'offline_access' 权限,则令牌不会过期。 @Brendan:但是一旦用户更改他/她的Facebook密码,它就会失效 @HoàngLong 对此有何参考?【参考方案6】:

因为我遇到了同样的问题 - 请参阅 ben bidton 关于此主题的出色帖子,他用错误的令牌和正确的类型来发送请求澄清了所有这些问题。

http://benbiddington.wordpress.com/2010/04/23/facebook-graph-api-getting-access-tokens/

【讨论】:

【参考方案7】:

每次用户通过 facebook 登录您的网站时,您始终可以刷新用户的访问令牌。 离线访问不能保证您获得终身访问令牌,只要用户撤销您的应用程序访问权限或用户更改他/她的密码,访问令牌就会更改。

引自脸书http://developers.facebook.com/docs/authentication/

注意:如果应用没有请求offline_access权限,访问令牌是有时间限制的。当用户退出 Facebook 时,有时限的访问令牌也会失效。如果应用程序已经从用户那里获得了offline_access 权限,那么访问令牌不会过期。但是,只要用户更改他/她的密码,它就会失效。

假设您将用户的 facebook uid 和访问令牌存储在数据库的用户表中,每次用户单击“使用 facebook 登录”按钮时,您使用 facebook javascript API 检查登录状态,然后检查连接状态从响应中,如果用户已连接到您的站点,则您可以更新表中的访问令牌。

【讨论】:

【参考方案8】:

点击此按钮以将短期访问令牌换成长期/未过期(页面)令牌:

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 

【讨论】:

【参考方案9】:

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

【讨论】:

【参考方案10】:

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 

【讨论】:

【参考方案11】:

这已经是几年后的事了,但 Facebook Graph API Explorer 现在在访问令牌旁边有一个小信息符号,可让您访问访问令牌工具应用程序,并将 API 令牌延长几个月。在开发过程中可能会有所帮助。

【讨论】:

【参考方案12】:

在与 facebook graph api 交互时检查以下事项。

1) 应用程序连接 URL 应该是“redirect_uri”的基础 连接网址:- www.x-minds.org/fb/connect/ redirect_uri - www.x-minds.org/fb/connect/redirect 2)您的“redirect_uri”在两种情况下都应该相同(当您请求验证码和请求access_token时) redirect_uri - www.x-minds.org/fb/connect/redirect 3)当您请求 access_token 时,您应该对参数进行编码 4) 当您请求 access_token 时,不应传递参数 (type=client_cred)。授权服务器将发出一个没有会话部分的令牌。我们不能在图形 api 中将此标记与“me”别名一起使用。此令牌的长度为 (40),但带有会话部分的令牌的长度为 (81)。 没有会话部分的访问令牌将适用于某些情况

例如:-https://graph.facebook.com/?access_token=116122545078207|EyWJJYqrdgQgV1bfueck320z7MM。 但是带有“me”别名的 Graph API 只能使用带有会话部分的令牌。

【讨论】:

【参考方案13】:

我不知道令牌究竟什么时候到期,但它们确实会到期,否则将无法提供离线权限。

无论如何,有时要求用户授予离线权限是一种矫枉过正的做法。根据您的需要,只要在用户的浏览器中打开网站,令牌保持有效就足够了。为此,可能有一个更简单的解决方案 - 使用 iframe 定期重新登录用户:facebook auto re-login from cookie php

为我工作...

【讨论】:

以上是关于Facebook Oauth 2.0 访问令牌会过期吗?的主要内容,如果未能解决你的问题,请参考以下文章

Node.js 护照 OAuth 2.0 身份验证:存储访问和刷新令牌的位置

Facebook OAuth 2.0“代码”和“令牌”

OAuth 2.0 访问令牌未加密?

存储位置 - OAuth 2.0 中的访问令牌和刷新令牌

OAuth 2.0 访问令牌已过期,刷新令牌不可用

颤动中的Facebook登录错误:访问令牌错误:“code”:190,“message”:“无效的OAuth访问令牌。”],null)