在OAuth2中使用Laravel Socialite(在使用自定义提供程序的情况下)在Nginx-reverse-proxy

时间:2019-06-05 09:22:35

标签: laravel docker oauth-2.0 nginx-reverse-proxy laravel-socialite

在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 /参数。

0 个答案:

没有答案