Facebook 访问令牌:服务器端与客户端流

Posted

技术标签:

【中文标题】Facebook 访问令牌:服务器端与客户端流【英文标题】:Facebook access token: server-side vs client-side flows 【发布时间】:2012-02-22 11:42:18 【问题描述】:

Facebook docs:

Facebook 平台支持两种不同的 OAuth 2.0 用户登录流程:服务器端(在规范中称为身份验证代码流)和客户端(称为隐式流)。每当您需要从 Web 服务器调用 Graph API 时,都会使用服务器端流程。当您需要从客户端(例如在 Web 浏览器中运行的 javascript 或从本机移动或桌面应用程序中运行的 JavaScript)调用 Graph API 时,会使用客户端流。

这些流采用的访问令牌有什么区别? 它们的长度似乎不同。

我们可以在客户端上使用服务器端流令牌吗?否则,我们可以在服务器上使用客户端流令牌吗?

【问题讨论】:

【参考方案1】:

目前,Facebook 是这样说的 access_tokens。在服务器端 OAuth

如果 access_token 是从服务器端 OAuth 调用生成的,则 结果 access_token 将有更长的过期时间 默认。如果在仍然存在有效的 long-lived 时进行调用 该用户的用户 access_token,返回的用户 access_token 来自 这第二次调用可能相同或可能已更改,但在任一 如果过期时间将设置为较长的​​过期时间。

客户端 OAuth 流程将为您提供现有的、未过期的、短暂的用户 access_token。为了使这个 access_token 长期存在,facebook 提供了一个新的端点,它将短暂的 access_token 与一个寿命更长的 access_token 交换。终点是

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 

另外请注意

目前长寿命用户access_token有效期为60天 而短期用户 access_tokens 当前有效范围为 1 到 2 小时。

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

【讨论】:

这个页面链接确实解释了很多关于访问令牌的内容。 @Naveen 你能否澄清一下第一段是否以及如何仍然相关?【参考方案2】:

对于像我一样在 2014 年面临同样问题的人,Facebook 改进了有关访问令牌的文档。

令牌是便携的

了解访问令牌的一个重要方面是它们是可移植的。获得访问令牌后,您可以使用它从移动客户端、Web 浏览器或从您的服务器到 Facebook 的服务器进行调用。如果在客户端上获得了令牌,您可以将该令牌发送回您的服务器并在服务器到服务器的调用中使用它。如果令牌是通过服务器调用获得的,您还可以将该令牌发送到客户端,然后从客户端进行调用。

(来自https://developers.facebook.com/docs/facebook-login/access-tokens/#portabletokens)

所以是的,您可以在服务器上使用来自客户端的访问令牌,反之亦然;正如 naveen 已经说过的,不同之处在于客户端获得的令牌寿命很短,而服务器获得的令牌寿命很长。您还可以按照此处的说明将短期令牌转换为长期令牌:https://developers.facebook.com/docs/facebook-login/access-tokens/#extending

【讨论】:

将访问令牌发送到服务器的最佳方式是什么,只是客户端身份验证后的普通 ajax 调用?不过,这需要几秒钟。我试图解析来自服务器端 cookie 的签名请求,但 'access_token' 没有价值 我目前正在使用 ajax 调用的 html5/Cordova 应用程序中执行此操作,额外的往返时间不会对用户体验产生太大影响。它可能会根据您使用它的方式而有所不同,但您通常可以掩盖登录过程中的额外延迟,可能会显示加载程序或其他东西。【参考方案3】:

令牌可用于进行 API 调用,因为它表示您已通过身份验证并被授权做某事。

代码不能直接用于进行任何 API 调用。必须先用您的应用密码兑换它才能获得令牌

换句话说,代码就像一个加密令牌,只有拥有应用秘密的各方才能解密它。

顺便说一句,您的应用程序密码应该只出现在您的服务器代码中,绝不会出现在移动或网络客户端中。

视频基本上在 13:00 左右解释了这一切 https://developers.facebook.com/docs/facebook-login/security

【讨论】:

【参考方案4】:

user 访问令牌(和 页面 访问令牌)在服务器端或客户端环境中都是相同的(时间戳过期除外) )。

app 访问令牌在服务器端或客户端将完全相同。

【讨论】:

感谢您的回答。在这里找到更多信息:developers.facebook.com/docs/reference/api/permissions 请不要对这个答案投反对票。那我猜是对的。 不一定相同——这是一个很大的概括。服务器端令牌比客户端令牌寿命更长。

以上是关于Facebook 访问令牌:服务器端与客户端流的主要内容,如果未能解决你的问题,请参考以下文章

在 Rest API 中使用 Facebook 在 Express 和 NodeJS 中维护 JWT 的密钥和访问令牌

Facebook 访问令牌 - 服务器端身份验证

Facebook:发送 iOS 访问令牌服务器端并使用 App Secret 签名

通过 Facebook 令牌从 Android 应用程序对 WebAPI 的身份验证访问

将 Facebook 访问令牌传递到评论框

如何在身份服务器 4/身份验证代码流中请求访问令牌的附加声明?