Laravel社交登录:InvalidStateException(有时候)

13

我的网站上一些用户遇到了Laravel\Socialite\Two\InvalidStateException的问题。我按照Laravel Socialite: InvalidStateException中的回复所述步骤进行了尝试,但未能解决该问题。只有少数用户似乎遇到了这个问题。

我有2个fpm/nginx Docker容器,它们位于一个HAProxy负载均衡器后面。


@KareemEssawy 将其注释掉是一个巨大的安全问题。 - Ben
1
你可以在开发环境中尝试一下是什么导致了问题,是登录功能还是其他什么,另外你使用 Socialite 进行 Facebook 的 OAuth 认证吗? - Kareem Essawy
尝试这个 https://dev59.com/iF0a5IYBdhLWcg3wJVzv - Anand Pandey
只需删除所有会话,让用户再次登录即可。 - markus
@markus 这些人是第一次登录。 - Ben
显示剩余2条评论
4个回答

10

这似乎是一个无效状态问题,与socialite包相关,已经在此文章中解决。

你的一些用户使用不同的网址(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'。希望这能解决问题。


你在本地主机上做什么? - Connor Leech
我想你只需要简单地写入 localhost 或者如果你有一个端口,可以写 127.0.0.1:80。 - Syed Waqas Bukhary
2
@ConnorLeech 对于本地主机阶段,谷歌将忽略它,这个解决方案仅适用于生产阶段。 - Fernando Torres

5
我敢打赌,这个问题出现是因为负载均衡。这是我的理论:
  1. 粘性会话:如果您的负载均衡器没有正确配置粘性会话,则可能会导致某些用户在服务器1上启动新会话,并在后续请求结束时转到服务器2,这可能会引发 Laravel\Socialite\Two\InvalidStateException 异常。

  2. 请求超时:我不确定这点,但是也许您的会话生存时间不足以完成一些过程,而这也会抛出 Laravel\Socialite\Two\InvalidStateException 异常。

也许如果您将 Laravel 会话存储更改为分散式数据库而不是默认文本文件配置,就可以解决异常。

会话在外部的 redis 实例中持久化,这个实例被 nginx/fpm 容器共享用于会话存储。这难道不会消除 Sticky Sessions 理论吗? - Ben
那么,是的,那不是一个黏性会话的问题。认证是通过API吗?阅读关于使用redis的socialite时发现了这个stateless authentication,或许这会有所帮助。 - Adrian Piña
所以...也许我误解了无状态。用户登录后,我使用我的令牌从他们的API获取更多数据。在这种情况下,使用无状态是否合适? - Ben
你找出问题了吗?我的意思是,你的后端和前端分离了吗?你的应用程序是否使用OAuth或类似的方式对用户进行身份验证? - Adrian Piña
它在一周前突然停止显示。虽然我可以确认我在10天以上没有触碰这个进程。所以我不知道发生了什么。 - Ben

0
在您的生产环境文件中,只需添加SESSION_DOMAIN=http://example.com即可被您的config/session.php所识别。对于本地开发,您不需要这个。

0

替换

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

转换为这段代码

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

任何社交媒体(如Facebook、GitHub等)登录


你回答底部的 any social 是什么意思? - greybeard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接