首页 > 解决方案 > 我可以直接从我的服务器上的 FB.login 使用访问令牌吗?

问题描述

我想实现一个不执行传统 oauth 重定向的 Facebook 身份验证。它不能很好地与我的单页应用程序和 GraphQL API 配合使用。

在 JS 方面,我可以调用FB.login来触发用户登录的对话框。如果成功,我会收到一个包含 anaccessToken和 a的对象signedRequest

signedRequest可以在服务器上解码,它为我吐出一个code。我可以使用codewith/oauth/access_token来获取accessToken.

但是,我已经从响应中获得了accessToken全部时间。FB.login所以我的问题是:如果我一直都拥有访问令牌,那么我解码签名的请求有什么意义吗?

奖励:为什么 FB API 首先提供签名请求,为什么 oauth 默认重定向code而不是转发accessToken

标签: facebooksecurityoauth

解决方案


是的,您可以直接在服务器上使用从客户端登录获得的令牌。

然而,它可能是一个短暂的,而服务器端登录流程应该立即为您提供一个长期的。如果您只需要在用户在您的页面上处于活动状态时执行 API 调用,那么短暂的调用可能就可以了。(它仍然可以通过服务器端 API 调用换成长期存在的,https://developers.facebook.com/docs/facebook-login/access-tokens/refreshing

为什么 FB API 首先提供签名请求

它还包含更多信息,这可能对客户端应用程序有用(用户 ID、令牌到期、在旧的“Canvas”类型应用程序的情况下从外部传入数据),并且可能会节省一个额外的 API 调用得到这样的信息。https://developers.facebook.com/docs/reference/login/signed-request/

为什么oauth默认重定向代码而不是accessToken?

一般安全措施。直接包含在返回 URL 中的令牌很容易被嵌入在该页面上的第 3 方脚本窃取(广告服务器等也可能不时被黑客入侵),或者作为 HTTP 引荐来源网址的一部分泄露。
code参数需要您的应用程序机密,以便 API 调用将其交换为令牌,因此,如果代码以任何此类方式泄漏,其他任何人都无法使用它。


推荐阅读