Facebook应用程序Iframe OAuth登录/权限错误-可以避免吗?

Facebook应用程序Iframe OAuth登录/权限错误-可以避免吗?,facebook,facebook-graph-api,facebook-iframe,facebook-oauth,Facebook,Facebook Graph Api,Facebook Iframe,Facebook Oauth,我的问题与这里概述的相同——我已经能够使用公认答案中提供的解决方法来确保用户在首次使用应用程序时正确查看权限框 然而,我的问题是,在应用程序的初始“安装”之后,这种形式的重定向对用户来说是非常具有破坏性的——在被重定向回来之前,用户显然会被从Facebook网站上带走。它真的破坏了用户体验。如果我使用由我正在使用的CodeIgniter库()提供的标准登录方法,那么应用程序的登录/加载是无缝的——但是我在第一次使用应用程序时遇到了上述问题 是否有一种方法可以检测用户是否安装了应用程序,以便我可以

我的问题与这里概述的相同——我已经能够使用公认答案中提供的解决方法来确保用户在首次使用应用程序时正确查看权限框

然而,我的问题是,在应用程序的初始“安装”之后,这种形式的重定向对用户来说是非常具有破坏性的——在被重定向回来之前,用户显然会被从Facebook网站上带走。它真的破坏了用户体验。如果我使用由我正在使用的CodeIgniter库()提供的标准登录方法,那么应用程序的登录/加载是无缝的——但是我在第一次使用应用程序时遇到了上述问题


是否有一种方法可以检测用户是否安装了应用程序,以便我可以对除应用程序“install”之外的每个实例使用主登录方法

在iframe canvas应用程序中,如果用户已授权您的应用程序,则已签名的请求将包含用户id和oauth令牌,因此无需将用户重定向到“授权”页面。以下是已签名的_请求可能包含的内容的几个示例:

用户尚未授权应用程序:

signed_request = 
                {
                    "algorithm":"HMAC-SHA256",
                    "issued_at":1299083443,
                    "user":{"country":"ca","locale":"en_US","age":{"min":21}
                }
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
                }
用户已授权应用程序:

signed_request = 
                {
                    "algorithm":"HMAC-SHA256",
                    "issued_at":1299083443,
                    "user":{"country":"ca","locale":"en_US","age":{"min":21}
                }
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
                }
如果没有看到用户id和oauth令牌,那么可以使用JavaScript window.top.location.href技术。如果您确实看到用户id和oauth令牌,则无需要求用户验证您的应用,因为他/她已经验证了。换句话说,如果用户在1月1日授权了你的应用程序,然后在1月10日返回,那么签名的请求在1月10日访问时已经包含了用户id和oauth令牌

这就是我使用的技术。我希望这有帮助

更新于2011年3月7日以回应BrynJ的以下评论

要获取签名的_请求,必须确保在应用程序设置中启用“OAuth 2.0 for Canvas”(在此处编辑设置时,可以在“高级”选项卡中找到)。默认情况下,所有新应用都会启用此功能,但如果您有旧应用,则需要自己启用。另外,请注意同一“高级”选项卡中的“画布发布”设置。如果启用此选项,则签名的_请求将在POST正文中传递(例如,签名的_请求=12345)。如果它被禁用,那么签名的_请求将在查询字符串中传递

一旦您有了签名的_请求,您将需要对其进行验证和解码,以获得用户_id和oauth_令牌。Facebook在这里有一个非常好的例子:


顺便说一句,你会想启用“画布上的帖子”,因为Facebook将在3月12日将所有iframe应用程序切换到这个页面。此处的更多信息:

这听起来是一个理想的解决方案-请原谅这个可能很明显的问题-但是我如何访问这个签名请求对象?BrynJ,请查看上面我的答案的更新以回应您的评论。