在OAuth 2.0身份验证期间,我在Largin / Socialite应用程序运行在nginx反向代理(执行SSL终止)后遇到问题。身份提供程序(自定义提供程序,不是Facebook或任何已知的提供程序)重定向到我服务器上的回调后,就会发生这种情况。 Laravel应用程序抛出一个InvalidStateException,我发现它很难调试。任何调试方面的帮助都将非常有帮助!
我们使用的OAuth框架是Socialite Providers,该错误发生在/var/www/html/vre/vendor/socialiteproviders/manager/src/OAuth2/AbstractProvider.php
,第37行:
/**
* @return \SocialiteProviders\Manager\OAuth2\User
*/
public function user()
{
if ($this->hasInvalidState()) {
throw new InvalidStateException(); ## <--- here!
}
我们的想法是Cookie可能有问题,例如Nginx似乎没有传递所有必要的会话信息。因为在没有反向代理的情况下,该部分有效。因此,我认为nginx吞噬了我们需要的东西。
我在SO上找到了一些答案,这些答案表明我们需要将域明确设置为config/session.php
中的代理主机-我们做到了。我也在我的nginx配置中进行域重写。因此,这似乎不是原因。存储/框架/ cookie中的cookie确实包含正确的域(但是使用http,而不是https-不确定是否重要吗?)。
其他人说我们应该添加stateless()
:
$provider = \Socialize::with($facebook);
if (Input::has('code')) {
$user = $provider->stateless()->user();
}
但是在此之前,我想知道它的作用-仅关闭某些功能并不能真正“解决”问题,对吗? (而且,我不知道在哪里插入该代码,我在应用程序中找不到它。)
这些是我的Nginx设置:
location ~ /(.*)$ {
proxy_pass http://mylaravelcontainer/$1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
这是Laravel错误:
dashboard_1 | [2019-06-05 08:28:21] local.ERROR: {"exception":"[object] (Laravel\\Socialite\\Two\\InvalidStateException(code: 0): at /var/www/html/vre/vendor/socialiteproviders/manager/src/OAuth2/AbstractProvider.php:37)
dashboard_1 | [stacktrace]
dashboard_1 | #0 /var/www/html/vre/app/Http/Controllers/Auth/LoginController.php(81): SocialiteProviders\\Manager\\OAuth2\\AbstractProvider->user()
dashboard_1 | #1 [internal function]: App\\Http\\Controllers\\Auth\\LoginController->handleProviderCallback()
...
两个应用程序都被docker化并在同一台计算机上运行。 nginx使用docker-network内部的容器名称访问后端。如果需要在此处发布任何其他信息,我们很乐意。
我想我对state
的创建和处理方式还不了解,所以我什至不知道从哪里开始。在请求期间我需要比较哪些标题/ cookie /参数。