【问题标题】:Laravel Socialite: InvalidStateException (sometimes)Laravel 社交名流:InvalidStateException(有时)
【发布时间】:2018-06-25 08:25:39
【问题描述】:

一些我网站上的用户正在经历 Laravel\Socialite\Two\InvalidStateException。我已采取对Laravel Socialite: InvalidStateException 的回复中概述的步骤,但未能解决问题。似乎只有一小部分用户遇到了这种情况。

我有 2 个 fpm/nginx docker 容器位于 HAProxy 负载平衡器后面。

【问题讨论】:

标签: php laravel-socialite


【解决方案1】:

这似乎是socialite 包中的无效状态问题,已在此post 中解决。

您的一些用户正在使用不同的网址(https://www.example.comhttps://example.com)访问您的网站,从而导致会话中的“状态”不匹配。

如果您使用的是 Larvel 5.3 及更高版本...在 .env 文件中添加 SESSION_DOMAIN=http://example.com

对于其他版本,请转到您的 config/session.php 文件,然后添加您的域。 'domain' => 'www.example.com'

立即应用更改。运行'php artisan cache:clear''composer dump-autoload' 希望这能解决问题。

【讨论】:

  • 本地主机做什么?
  • 我想简单地写 localhost 或者如果你有一个端口做 127.0.0.1:80
  • @ConnorLeech 对于 localhost 阶段,google 将忽略它,此解决方案仅适用于生产阶段
【解决方案2】:

我敢打赌,问题是由于负载平衡器而出现的。这是我的理论:

  1. 粘滞会话:如果您的负载平衡器没有正确配置粘滞会话,则某些用户可能会在服务器 1 上启动新会话,并在随后的请求中在服务器上结束2 这可能是在抛出Laravel\Socialite\Two\InvalidStateException

  2. 请求超时:我不确定这一点,但是,也许您的会话生命周期不足以完成一些也会引发Laravel\Socialite\Two\InvalidStateException

    李>

也许如果您将 laravel 会话存储更改为分散式数据库而不是默认的文本文件配置,则异常会得到解决。

【讨论】:

  • 会话保存在外部redis 实例中,两个nginx/fpm 容器共享用于会话存储。这不会消除 Sticky Sessions 理论吗?
  • 那么是的,这不是粘性会话问题。是否通过 API 进行身份验证?阅读使用 redis 的社交名流发现这个socialite stateless authentication 可能会有帮助。
  • 所以......也许我误解了无国籍。用户登录后,我使用我的令牌从他们的 API 获取更多数据。在这种情况下使用无状态是否适合我?
  • 您发现问题所在了吗?我的意思是,你的后端和你的前端是分开的吗?您的应用是否使用 oauth 或类似方式对用户进行身份验证?
  • 它在一周前随机停止显示。虽然我可以确认我已经 10 多天没有接触过这个过程。所以我不知道
【解决方案3】:

在您的生产环境文件中添加 SESSION_DOMAIN=http://example.com 以供您的 config/session.php 获取。对于本地开发,您将不​​需要它。

【讨论】:

    【解决方案4】:

    替换

    Socialite::driver('google')->user();
    

    到这个代码

    Socialite::driver('google')->stateless()->user();
    

    任何社交(任何社交登录,如 facebook github 等)

    【讨论】:

    • 答案底部的any social 是什么意思?
    猜你喜欢
    • 2015-08-20
    • 2018-05-11
    • 1970-01-01
    • 2019-12-17
    • 2016-01-29
    • 1970-01-01
    • 2021-02-10
    • 2016-09-11
    • 1970-01-01
    相关资源
    最近更新 更多