facebook sso state check: CSRF状态令牌与提供的不匹配



设置纯服务器流facebook SSO的基本步骤是什么?文档通常有点含糊不清?

我设置流与javascript弹出,后来才意识到你不允许自定义登录按钮。当你把它们贴在谷歌和推特旁边时,登录框看起来很糟糕。

http://www.codecademy.com/似乎指向他们自己的服务器,然后转发到这样的URL:

https://www.facebook.com/dialog/oauth?response_type=code
&client_id=212500508799908&
redirect_uri=http%3A%2F%2Fwww.codecademy.com%2Fauth%2Ffacebook%2Fcallback&state=8aac5bc63c5afe8fbabe572021e7750579fefd898d7b4316&
scope=email%2Cpublish_actions

这个URL是如何生成的?在facebook文档中有一个函数"getLoginUrl"..这个被调用生成正确的URL吗?

我尝试将用户直接从浏览器引导到:

var href =  'https://www.facebook.com/dialog/oauth?' +
        'client_id='+app_id+'&'+
        'redirect_uri=http://www.mysite.net/authenticate_facebook.php&'+
        'scope=email&';+
        'state='+$('body').attr('unique');

但是在facebook php然后以下接收代码导致关于"状态"不匹配的错误…我假设state不只是由我的服务器生成的随机值,必须从facebook服务器获得?

require_once(WEBROOT_PRIVATE.'authenticate/facebook-php-sdk/src/facebook.php');
$config = array(
    'appId' => 'xxx',
    'secret' => 'xxx',
    'fileUpload' => false,
    'allowSignedRequest' => false
);
$facebook = new Facebook($config);
$user_id = $facebook->getUser();
if($user_id)
{
    try
    {
        $user_profile = $facebook->api('/me','GET');
    }
    catch(FacebookApiException $e)
    {
        error_log($e->getType(), 0);
        error_log($e->getMessage(), 0);
    }
}

那么,这是正确的流程吗?

1 -引导用户到我的服务器facebook_auth.php

2 - facebook_auth.php生成get url并将用户转发到它

3 -用户,如果需要登录到facebook,允许我的应用程序

4 -我的facebook_auth.php脚本然后检查令牌并与facebook服务器之间的对话以验证其余的

5 -我的网站然后记录用户在

我上周遇到了类似的问题,并将其追踪到被多次调用getLoginUrl()覆盖的状态字段。每次调用getLoginUrl()时,在SDK中生成一个新的状态令牌并存储在$_SESSION中(它只是一个随机值),所以如果调用它两次并且用户使用第一个链接登录,则第二次调用将重置SDK的内部状态令牌,并且您将在日志中得到此错误。

SDK在Facebook授权用户并将其重定向到您的站点后返回的URL中查找相同的状态令牌,如果不匹配,它将记录此错误(这里是指向源的链接)

最新更新