【问题标题】:facebook sso state check: CSRF state token does not match one providedfacebook sso 状态检查:CSRF 状态令牌与提供的不匹配
【发布时间】:2014-11-25 19:46:16
【问题描述】:

设置纯服务器流facebook SSO的基本步骤是什么,文档和往常一样有点模棱两可?

我使用 javascript 弹出窗口设置了流程,但后来才意识到您不允许自定义登录按钮。当您将它们粘贴到下一个 google 和 twitter sso 时,登录框看起来很糟糕。

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 生成获取 url 并将用户转发到它

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

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

5 - 然后我的网站让用户登录

【问题讨论】:

  • 此错误的一个原因是 - 如果用户已经登录并且您正在再次调用 getLoginUrl() 方法。所以请确保你没有这样做,代码遵循不这样做的逻辑。
  • 我已经添加到我的问题中......流程是否正确逻辑?
  • 嗯,所以你确定一旦用户通过 FB 登录验证,getLoginUrl() 就不会再次调用。
  • 是的,对我来说,缺少的一块拼图是从 facebook 函数 getLoginUrl() 创建状态。相反,我正在创建自己的状态。它现在可以工作了。
  • 感谢您的提示!我不明白 facebook 和 google 的文档怎么会如此混乱.. 我正在转向 twitter sso.. 手指交叉这更直接

标签: php facebook facebook-graph-api


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-11
    • 2012-04-07
    • 2013-11-09
    • 2011-11-12
    • 2012-02-17
    • 2015-07-24
    • 1970-01-01
    • 2014-06-23
    相关资源
    最近更新 更多