【问题标题】:InvalidStateException in AbstractProvider.php line 191 with socialiteAbstractProvider.php 第 191 行中的 InvalidStateException 与社交名流
【发布时间】:2016-01-29 18:41:58
【问题描述】:

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

我的 services.php 谷歌设置:

'google' =>[
    'client_id'=> env('GOOGLE_CLIENT_ID'),
    'client_secret' => env('GOOGLE_CLIENT_SECRET'),
    'redirect' => "http://". env('DOMAIN'). "/login/google/callback",
],

我的会话

'domain'=> 'local.mysite.com'

【问题讨论】:

  • 看看下面的回答here
  • 这似乎是一个相当大的问题,很多人都遇到过这个问题,但是关于 cookie 的常见答案并没有解决它。我几乎尝试了 cookie 设置的所有变体,但均无济于事。就我而言,它在宅基地上工作得很好,但在生产服务器上根本不行,所以它告诉我 2 个环境之间的某些原因导致它(尝试将会话作为数据库和文件而不是文件权限)
  • 除了来自 Wader 的现有答案。 如果您在不同的环境中运行多个应用实例,请确保在浏览每个实例之间清理您的 cookie。在这种情况下,还要确保更改每个环境的应用程序密钥 (php artisan key:generate)

标签: php laravel oauth laravel-5


【解决方案1】:

我找到了原因,虽然我不确定为什么会出现这个问题,但可能是由于 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? (点赞最多的答案)

【讨论】:

  • 有趣。通常/etc/nginx/fastcgi_params 包含用于设置查询字符串、请求 uri 等的所有相关配置。这是否包含在您的 vhost 文件中?
  • 是的,但它必须与它丢失的特定安装有关,但指南没有说明这一点,所以我很容易看到人们不认为这是问题所在。毕竟通常你不会在 laravel 中使用查询字符串而只使用路由,所以大多数人可能不会在社交名流之外的任何东西上看到这个问题。
  • 我偶尔会遇到同样的错误。为了测试你关于 nginx 忽略查询字符串的理论,我实际上有一个查询字符串,我在我的注册页面上使用它,它工作正常。那会排除吗?我实际上无法在本地重现错误。
【解决方案2】:

该问题与您的会话有关,这始终是一个棘手的问题。在 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 登录时,您应该会在 URL 上看到 state 参数,请检查返回您的应用程序时是否也会返回此状态。

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

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

【讨论】:

  • 它与 cookie 无关,我可以理解这似乎是答案,但我花了大约 6 个小时尝试所有可能的 cookie 设置,每次都重置它们以进行测试但什么都不需要影响。但是you should see the state parameter on the URL 让我思考,最终帮助我找到了答案(将发布)。
  • 嗯,状态参数存储在会话中,所以它不匹配的原因只能是会话有问题。不管他们是被救了还是有什么问题,多一点信息可能会有很长的路要走:)
  • 是的,它真的很难诊断,但是看看我发布的答案,我的所有狩猎过程中,当我发现问题出在哪里时,我看到的只有饼干,哈哈。
  • 虽然这不正确,但它是一个很好的答案,所以我会给你赏金,我实际上并没有提出这个问题,所以我无法标记实际答案是什么。
【解决方案3】:

您可以尝试几个选项:

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

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

  • 确保在发出请求和接收请求时域和协议不区分。

  • 确保您的原始地址和重定向地址在您的 google 控制台匹配您的应用程序中配置的路由。

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

  • 最后,清除浏览器缓存和 cookie。

【讨论】:

    【解决方案4】:

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

    检查您的 .env 文件并确保 SESSION_DRIVER 未设置array

    数组会话不会持续存在,这就是社交名流无法验证状态并返回此错误的原因。

    你可以设置:

    SESSION_DRIVER=file
    

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

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

      • 使用认证;在控制器中调用提供者方法
      猜你喜欢
      • 1970-01-01
      • 2016-05-26
      • 2015-08-20
      • 2017-04-28
      • 1970-01-01
      • 2018-06-25
      • 2018-05-11
      • 1970-01-01
      • 2015-06-20
      相关资源
      最近更新 更多