【问题标题】:How to manually set an authResponse from an access token generated during server-side authentication如何从服务器端身份验证期间生成的访问令牌手动设置 authResponse
【发布时间】:2012-07-17 06:19:11
【问题描述】:

我正在编写一个使用服务器端身份验证的 Web 应用程序,并且我一直在尝试找出一种在我的应用程序中利用 Facebook 的 Javascript SDK 的方法。

FB.init 的文档将可选的 authResponse 参数定义为用于“手动设置可从 getAuthResponse 检索的对象”。它还指出,一旦获得,应用程序可以存储整个 authResponse 对象以供将来访问。如果应用程序使用 FB.login(Javascript SDK 的身份验证),这可能会起作用,但是使用服务器端身份验证的应用程序呢?

服务器端身份验证使我的应用能够获取用户的访问令牌,这是图形 API 调用所需的最关键信息。我希望仅此 access_token 就足以构造一个有效的 authResponse 对象,用于进行身份验证以与 Javascript SDK 一起使用。

仅使用包含有效“accessToken”字段的 authResponse 调用 FB.init(使用有效的 appID、channelUrl 和其他参数)是不够的。包括 userId 也是不够的。理想情况下,仅这些参数就可以工作。为 authResponse 定义的唯一其他人是“expiresIn”和“signedRequest”。这些参数中的哪一个(如果有的话)足以生成有效的 authResponse 对象?必须将它们分配给什么值?

我设法挖掘了“签名请求”的描述: https://developers.facebook.com/docs/authentication/signed_request/

本文档提出了许多问题。我假设签名是由对称算法产生的。如果没有,则无法生成它。假设有可能,有效载荷的描述绝不是具体的。有 9 个参数的列表,没有一个是必需的。

【问题讨论】:

  • 在这种情况下,您不需要手动传递任何内容。你用cookie:true初始化了JS SDK吗?尝试在服务器端登录后调用 FB.getLoginStatus - 这会给你什么响应?

标签: oauth facebook-javascript-sdk facebook-authentication facebook-oauth


【解决方案1】:

就像 CBroe 所说,您不应该手动传递任何东西。您首先调用FB.getLoginStatus 并将您的javascript 处理程序作为参数传递给此方法。您将从 getLoginStatus 调用返回 authResponse。

当然,理论上您可以将 access_token 参数传递给任何 FB.api 调用,例如/me?access_token=blah_blah,其中 blah_blah 是您拥有的字符串,但同样,这不是必需的,您最好将其委托给响应处理程序。

在使用 javascript sdk 和服务器端身份验证进行访问令牌生成/扩展/验证时要非常小心。您最终会维护两个单独的代码路径,并最终一遍又一遍地对 Facebook 进行相同的调用。即使您将访问令牌存储在您身边,也最好选择一种最适合您的方法,而不是通过服务器端调用来获取访问令牌并在客户端调用 FB.api 来使用访问权限令牌。

【讨论】:

  • 如果你很好奇,我已经尝试过你的建议,但我收到一个错误,表明我使用了无效的 access_token。事实证明,在进行 API 调用之前,我并没有等待 getLoginStatus 完成。
  • 最后,我相信在将 javascript SDK 与服务器端 Web 应用程序一起使用时能够手动设置访问令牌是有价值的。我的应用程序存储用户的 access_token 并为用户创建会话。如果用户退出 facebook,他们将继续登录我的应用程序。如果有人登录另一个 facebook 帐户,原始用户会继续登录。但是,如果我使用 Javascript SDK,它会识别出与我的应用不同的用户。文档建议它支持设置 authResponse,但提供的有关如何设置的信息不足。
【解决方案2】:

有一个解决方案。没想到这么简单。

FB.api('/me?access_token={{ access_token }}', function (me) {
    console.log(me); //do anything with me
});

所以您之前不需要在 FB 中设置 Objekt 变量 - 只需将 access_token 作为参数添加到您的请求中即可。

【讨论】:

    猜你喜欢
    • 2012-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-01
    • 1970-01-01
    • 2016-05-23
    相关资源
    最近更新 更多