facebook sso状态检查:CSRF状态令牌与提供的不匹配

时间:2014-03-15 13:26:49

标签: php facebook facebook-graph-api

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

我用javascript弹出窗口设置流程只是为了以后意识到你不能自定义登录按钮..当你坚持下一个google和twitter sso时,登录框看起来很糟糕。

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

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

如何生成此网址?在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生成获取网址并将用户转发到其上

3 - 如果需要登录Facebook,用户可以使用我的应用

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

5 - 我的网站随后将用户登录到

1 个答案:

答案 0 :(得分:0)

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

SDK会在Facebook授权用户并将其重定向回您的网站后在URL中查找相同的状态令牌,如果它不匹配,则会记录此错误(此处为“链接”)来源)。