Facebook canvas身份验证:重定向后没有signed_request参数

时间:2011-08-01 12:56:33

标签: facebook authentication canvas

在我的画布页面中,我尝试使用http://developers.facebook.com/docs/guides/canvas/中描述的方式对用户进行身份验证,主要使用此代码(来自developers.facebook.com的示例代码):

<?php 

 $app_id = "YOUR_APP_ID";

 $canvas_page = "YOUR_CANVAS_PAGE_URL";

 $auth_url = "http://www.facebook.com/dialog/oauth?client_id=" 
        . $app_id . "&redirect_uri=" . urlencode($canvas_page);

 $signed_request = $_REQUEST["signed_request"];

 list($encoded_sig, $payload) = explode('.', $signed_request, 2); 

 $data = json_decode(base64_decode(strtr($payload, '-_', '+/')), true);

 if (empty($data["user_id"])) {
        echo("<script> top.location.href='" . $auth_url . "'</script>");
 } else {
        echo ("Welcome User: " . $data["user_id"]);
 }

?>

问题是,用户第一次授权我的画布应用程序时,Facebook在重定向时没有传递signed_request参数(如示例代码中所述),而是code参数。第二次访问应用程序(已经确认权限)时,它会按预期传递signed_request参数。

为什么它第一次传递code参数? Facebook传递code / signed_request参数时,文档没有解释。

9 个答案:

答案 0 :(得分:2)

问题在于,对于$canvas_page,我使用了画布网址(例如mysite.com/canvas)而不是画布页面网址(例如apps.facebook.com/myapp)。

答案 1 :(得分:2)

我认为您需要将“&amp; response_type = token”附加到您的身份验证网址:

https://www.facebook.com/dialog/oauth?client_id=YOUR_APP_ID&redirect_uri=YOUR_URL&response_type=token

然后你会得到一些看起来像的东西:

http://apps.facebook.com/APP_NAME/#access_token=YOUR_APP_ID%YADA_YADA_YADA0&expires_in=3948

你可以用一些Javascript提取它:

if (window.location.hash.length == 1)
{
       var accessToken = window.location.hash.substring(1);
}

答案 2 :(得分:1)

Facebook使用code参数来验证您的应用程序。在文档中,它声明:

*如果用户按下允许,则您的应用已获得授权。 OAuth对话框将使用授权码*

将用户浏览器重定向(通过HTTP 302)到redirect_uri参数中传递的URL

要完成授权,您现在必须将code参数和应用程序保密,并将其传递给Graph API令牌端点(解释文档)。这将授予您访问访问令牌的权限。从现在开始,您的应用程序将不需要此用户的代码参数,因为它们已经过身份验证。

Facebook使用signed_request与您的应用程序共享信息。该文档说明了它将通过签名请求的三种方案。这些是:

  • 当signed.dll加载到Facebook环境中时,signed_request将被传递到Facebook.com上的应用程序
  • 当给定用户使用App Dashboard删除应用时,signed_request将传递给在开发者应用中注册了Deauthorized Callback的任何应用
  • 只要用户成功注册其应用
  • ,就会将signed_request传递给使用注册插件的应用

总而言之,代码参数仅用于验证应用程序,而signed_request用于在应用程序获得授权后传递信息。

答案 3 :(得分:1)

Saj-并且非常正确。 我也很喜欢这个。 将redirect_uri设置为我的域名时,我得到了一个infinate重定向循环。 将redirect_uri设置为facebook app url时,我收到一条错误消息,指出该url不在我的域中,因此无法访问。 最后用“/”来解决这个问题

答案 4 :(得分:1)

我的画布应用程序遇到了同样的问题,我通过简单地重定向到我的应用程序的画布URL来修复它,如果有一个代码 GET请求参数。之后,Facebook向我发送了包含 signed_request 参数的POST请求。这是Python Django片段:

if 'code' in request.GET.keys():
    return HttpResponseRedirect(FACEBOOK_CANVAS_URL)

# ...rest of your canvas handling code here

答案 5 :(得分:0)

我一直在努力解决这个问题(没有在signed_request中获取oauth ID,而是在用户批准应用后获得“代码”)超过一周,这篇帖子(以及其他一些帖子)帮助我非常接近解决问题(我在重定向URI中使用我的应用程序画布URL而不是画布页面URL,而我没有在设置中指定名称空间)。

在进行这些更正后,我遇到了一个不同的问题,即应用程序批准页面不会显示给新用户,而Facebook会抛出消息“应用程序有错误等等。最后我想我错过了/在我的重定向网址的画布页面url的末尾..我在重定向uri中将其作为https://apps.facebook.com/myappname而不是https://apps.facebook.com/myappname/。在最后添加/解决了问题以及新用户访问时的问题我的应用程序使用https://apps.facebook.com/myappname(如果用户已经登录)facebook显示批准页面(收到我服务器的响应后),一旦用户批准该应用程序,facebook就会发送带有所需身份验证代码的签名请求希望这对于可能遇到同样问题的其他人有用。

答案 6 :(得分:0)

只是为了清除关于代码参数的混淆..当用户允许应用程序时,Facebook将始终发送此参数..但是,使用post或其他方法发送signed_request参数..它不会在url中发送..您可以使用$ _REQUEST [&#39; signed_request&#39;]

访问它

答案 7 :(得分:0)

当我为我的应用分配了一个命名空间时,我遇到了类似的问题,所以它看起来像apps.facebook.com/myapp而不是apps.facebook.com/1234。

答案 8 :(得分:0)

我遇到了您使用Firefox描述的问题以及禁用了第三方Cookie。

我启用了第三方Cookie,然后突然出现了signed_request。

相关问题