InvalidStateException во время OAuth2 с Laravel Socialite, с использованием собственного провайдера, за nginx-reverse-proxy - PullRequest
0 голосов
/ 05 июня 2019

У меня проблема во время аутентификации OAuth 2.0 с приложением Laravel / Socialite, работающим за обратным прокси-сервером nginx (который выполняет SSL-завершение). Это происходит после того, как провайдер Identity (пользовательский, а не Facebook или любой другой известный) перенаправляет на обратный вызов на моем сервере. Приложение Laravel создает исключение InvalidStateException, которое мне трудно отладить. Любая помощь для отладки это будет очень полезно!

Платформа для OAuth, которую мы используем, - провайдеры Socialite, ошибка возникает в /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-файлы в хранилище / framework / 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()
...

Оба приложения докеризируются и работают на одном компьютере. nginx получает доступ к бэкэнду, используя имя контейнера внутри Docker-сети. Если есть какая-либо дополнительная информация, которую я должен опубликовать здесь, я буду рад это сделать.

Думаю, я недостаточно знаю, как создается и обрабатывается state, поэтому я даже не знаю, с чего начать. Какие заголовки / куки / параметры мне нужно сравнивать во время запросов.

...