我遇到了与此处列出的问题相同的问题Facebook OAuth login for iframe canvas apps displays a logo image and a Go to Facebook.com caption instead of logging in - 我已经能够使用已接受答案中提供的解决方法来确保用户在首次使用该应用程序时正确查看权限框。
然而,我的问题是,在应用程序的初始“安装”之后,这种形式的重定向对用户来说是非常具有破坏性的 - 在被重定向之前,它们被明显地从Facebook站点上带走。它确实打破了用户体验。如果我使用我正在使用的CodeIgniter库提供的标准登录方法(http://www.haughin.com/code/facebook/),那么应用程序的登录/加载是无缝的 - 但我在首次使用该应用程序时遇到了上述问题。
有没有办法可以检测用户是否安装了应用程序,所以我可以为应用程序“install”以外的每个实例使用主登录方法?
答案 0 :(得分:2)
在您的iframe画布应用中,如果用户已经授权您的应用,则signed_request将包含user_id和oauth_token,因此无需将用户重定向到“授权”页面。以下是signed_request可能包含的几个示例:
用户未授权app:
signed_request =
{
"algorithm":"HMAC-SHA256",
"issued_at":1299083443,
"user":{"country":"ca","locale":"en_US","age":{"min":21}
}
用户已经授权app:
signed_request = {
"algorithm":"HMAC-SHA256",
"expires":1299092400,
"issued_at":1299085507,
"oauth_token":access_token,
"user":{"country":"ca","locale":"en_US","age":{"min":21}},
"user_id":user_id
}
如果您没有看到user_id和oauth_token,则可以使用JavaScript window.top.location.href技术。如果您确实看到了user_id和oauth_token,则无需要求用户对您的应用进行身份验证,因为他/她已经这样做了。换句话说,如果用户在1月1日授权您的应用程序,然后在1月10日回来,那么signed_request将在1月10日访问时包含user_id和oauth_token。
这是我使用的技术。我希望这会有所帮助。
2011年3月7日更新以回应BrynJ的评论。
要获取signed_request,您必须确保在您的应用程序设置中启用了“OAuth 2.0 for Canvas”(当您在此处编辑设置时可以在“高级”标签中找到http://www.facebook.com/developers/apps.php) 。默认情况下,这对所有新应用都启用,但如果您有旧应用,则需要自行启用。另外,请在同一“高级”选项卡中注意“POST for Canvas”设置。如果启用此选项,则在POST正文中传递signed_request(例如signed_request = 12345)。如果它被禁用,则signed_request将在查询字符串中传递。
拥有signed_request之后,您需要验证并解码它以获取user_id和oauth_token。 Facebook在这里有一个很好的例子:
http://developers.facebook.com/docs/authentication/signed_request/
顺便说一下,你想要启用“POST for Canvas”,因为Facebook将在3月12日将所有iframe应用程序切换到这个。更多信息:http://developers.facebook.com/docs/canvas/post/