我正在使用服务器端身份验证编写Web应用程序,并且我一直试图找到一种方法来在我的应用程序中利用Facebook的Javascript SDK。
FB.init的文档将可选的authResponse参数定义为“手动设置可从getAuthResponse检索的对象”的用法。它还指出,一旦获得,应用程序可以存储整个authResponse对象以供将来访问。如果应用程序使用Javascript SDK的身份验证FB.login,那么这可能有用,但是使用服务器端身份验证的应用程序呢?
服务器端身份验证使我的应用程序能够获取用户的访问令牌,这是图API调用所需的最重要的信息。我希望单独使用这个access_token就足以构建一个有效的authResponse对象,用于验证与Javascript SDK一起使用。
仅使用包含有效“accessToken”字段的authResponse调用FB.init(具有有效的appID,channelUrl和其他参数)是不够的。包括userId也不够。理想情况下,仅这些参数就可以起作用。为authResponse定义的唯一其他是'expiresIn'和'signedRequest'。这些参数中的哪一个足以生成有效的authResponse对象?必须分配哪些值?
我设法挖掘了'signedRequest'的描述: https://developers.facebook.com/docs/authentication/signed_request/
本文件提出了一些问题。我假设签名是由对称算法产生的。如果没有,那么生成它是不可能的。假设有可能,有效载荷的描述绝不具体。有一个包含9个参数的列表,其中没有一个被标记为必需。
答案 0 :(得分:0)
就像CBroe所说,你不应该手动传递任何东西。首先调用FB.getLoginStatus并将javascript处理程序作为参数传递给此方法。您将从getLoginStatus调用返回authResponse。
当然,理论上你可以将access_token参数传递给任何FB.api调用,例如: / me?access_token = blah_blah,其中blah_blah是你拥有的字符串,但是这不是必需的,你最好将它委托给响应处理程序。
使用javascript sdk和服务器端身份验证进行访问令牌生成/扩展/验证时要非常小心。您最终维护两个单独的代码路径,最终一遍又一遍地对Facebook进行相同的调用。即使您将访问令牌存储在您身边,也总是更好地选择一种最适合您的方法,而不是让服务器端调用获取访问令牌和客户端调用FB.api来使用访问权限令牌。
答案 1 :(得分:0)
有一个解决方案。我不认为这很容易。
FB.api('/me?access_token={{ access_token }}', function (me) {
console.log(me); //do anything with me
});
所以你之前不需要在FB中设置Objekt变量 - 只需将access_token作为参数添加到您的请求中。