带有socialite的AbstractProvider.php第191行中的InvalidStateException

时间:2015-10-29 14:43:45

标签: php laravel oauth laravel-5

当我尝试使用google或fb登录时,我只在本地计算机上出现此错误。我几乎100%确定我的服务和session.php设置正确。但是,唉,我们在这里......

我的services.php谷歌设置:

<button onclick="checkInput()">Button</button>

我的会议

// Pure JS
function checkInput () {
  if(document.getElementById('inputId').value == "correct input") {

    var modal = document.getElementById("modalId");
    modal.className = modal.className + " hide";

  }
}

//JQuery
function checkInput () {
  if($('#inputId').val() == "correct input") {
    $('#modalId').modal('toggle');
  }
}

5 个答案:

答案 0 :(得分:5)

我发现了原因,虽然我不确定为什么会出现这个问题,但可能是因为ubuntu / nginx版本,但我们就去了。

为了在nginx中获得正确的laravel设置,我已经使用过了 https://www.digitalocean.com/community/tutorials/how-to-install-laravel-with-an-nginx-web-server-on-ubuntu-14-04

也证实了这一点 https://laravel.com/docs/5.1/installation#pretty-urls

它也是与宅基地相同的nginx配置,所以通常会有人看不到任何问题,但在从谷歌返回后专门检查查询字符串后,我注意到它丢失了。 laravel中的路由本身运行良好,但无法查看常规查询字符串。

所以答案是在位置块内而不是

try_files $uri $uri/ /index.php$query_string;

你需要使用

try_files $uri $uri/ /index.php$is_args$args;

我是从

中找到的

Why is NGINX is ignoring my query strings? (最受欢迎的答案)

答案 1 :(得分:3)

这个问题与你的会话有关,这总是一个棘手的问题。在oAuth2中,您可以在发送用户进行身份验证时提供state参数,然后在用户通过身份验证后将其发送回您的应用程序。

Socialite将随机字符串放入会话和此state参数,并在用户返回时检查它是否包含相同的值。

见第134和212行。https://github.com/laravel/socialite/blob/e04ab0bb972662fc72708dfd4eef35200965cca1/src/Two/AbstractProvider.php#L134

有几个尝试的解决方案......

首先,您是否可以使用您的用户名和密码而不是Google oauth登录?

检查您的config/session.php域名是否设置正确,如果您通过HTTPS运行,则https选项仅设置为true。如果启用了https选项,则只有在通过访问站点时才会设置会话。 HTTPS。

'domain' => 'example.com',

如果您在应用程序中使用子域,则会在会话配置中将.添加到域的开头。这将允许会话传递到所有子域。

'domain' => '.example.com',

当您收到google登录信息后,您应该会在网址上看到state参数,检查返回您的应用程序时是否也会返回此状态。

您还可以尝试清除浏览器Cookie和缓存(或使用隐身窗口),这样可以确保以前的测试/现有Cookie之间没有冲突。

您还可以通过删除/vendor文件夹并再次运行composer install来尝试重新安装依赖项。这对我来说已经解决了会议的问题,原因不明。

答案 2 :(得分:0)

您可以尝试几种选择:

  • 在您的域的会话文件中以http://为首,如下所示:

    'domain'=> 'http://local.mysite.com'

  • 确保域名&amp;协议在提出请求时不区分收到请求。

  • 确保您的来源地址&amp;你的配置重定向地址 谷歌控制台匹配您的应用程序中配置的路线。

  • 从控制台运行以下命令。 php artisan cache:clear&amp; composer dump-autoload

  • 最后,清除您的浏览器缓存&amp;饼干。

答案 3 :(得分:0)

有同样的问题,没有一个解决方案有效,那么我得到了答案:

检查.env文件并确保 SESSION_DRIVER 未设置 数组

数组会话将不会持久存在,这就是为什么Socialite无法验证状态并返回此错误。

您可以设置:

SESSION_DRIVER=file

或从这些类型中选择(数组除外): https://laravel.com/docs/5.0/session#session-drivers

如果您使用memcached / redis / database或cookie,请确保它们已配置并正常工作。

答案 4 :(得分:0)

我遇到了同样的错误,我解决了将所有社交网络路由放入网络中间件的问题。

我们需要\ Illuminate \ Session \ Middleware \ StartSession来启动会话。