Laravel 社交名流:InvalidStateException(有时)
Posted
技术标签:
【中文标题】Laravel 社交名流:InvalidStateException(有时)【英文标题】:Laravel Socialite: InvalidStateException (sometimes) 【发布时间】:2018-06-25 08:25:39 【问题描述】:一些我网站上的用户正在经历
Laravel\Socialite\Two\InvalidStateException
。我已采取对Laravel Socialite: InvalidStateException 的回复中概述的步骤,但未能解决问题。似乎只有一小部分用户遇到了这种情况。
我有 2 个 fpm/nginx docker 容器位于 HAProxy 负载平衡器后面。
【问题讨论】:
在***.com/questions/29629287/…试试答案 @KareemEssawy 评论这是一个巨大的安全问题 可能您可以在开发环境中尝试导致问题的原因,是登录功能还是其他原因,您是否也使用 Socialite 进行 Facebook 的 OAuth 身份验证? 试试这个***.com/questions/30660847/… 只需删除所有会话并让人们重新登录。 【参考方案1】:这似乎是socialite 包中的无效状态问题,已在此post 中解决。
您的一些用户正在使用不同的网址(https://www.example.com 或 https://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 上启动新会话,并在随后的请求中在服务器上结束2 这可能是在抛出Laravel\Socialite\Two\InvalidStateException
请求超时:我不确定这一点,但是,也许您的会话生命周期不足以完成一些也会引发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
是什么意思?以上是关于Laravel 社交名流:InvalidStateException(有时)的主要内容,如果未能解决你的问题,请参考以下文章