Куки удаляются после входа в gmail

Я внедряю систему онлайн-бронирования, используя Laravel Framework версии 5.6 и Laravel Socialite для реализации входа в gmail.

У меня есть метод, который проверяет, вошел ли пользователь в систему перед резервированием, или помещает reserveData и redirectUrl, указанные uniqid в redis и cookie, чтобы получить его после входа в систему:

public function checkAuthentication(Request $request)
{
    $reserveData = json_decode($request->input('reserveData'), true);
    Session::put('reserveData', $reserveData);

    if (!Auth::check()) {
        $reserveID = uniqid();
        Cookie::queue(Cookie::forget('reserveID'));
        Cookie::queue(Cookie::make('reserveID', $reserveID, 1440));

        $stepData = [
            'redirectUrl' => route('reserve', ['productId' => $reserveData['productId']]),
            'reserveData' => $reserveData
        ];

        Redis::set($reserveID, serialize($stepData));

        return redirect()->route('redirectToGmail');
    }

    return redirect()->route('reserve', ['productId' => $reserveData['productId']]);
}

перенаправить на Gmail:

public function redirectToGmail()
{
    return Socialite::driver('google')->redirect();
}

Проблема в том, что uniqid не существует в файле cookie после возврата из gmail только при первой попытке пользователя войти в систему:

public function login()
{
    $user = Socialite::driver('google')->stateless()->user();
    dd(Cookie::get());
}

Вот мой вывод dd(Cookie::get()); после возвращения из gmail:

array:4 [▼
    "XSRF-TOKEN" => "DxiHpLSqB8juOkdLSptORyXs2XGggwWuY4tKJDkz"
    "project_session" => "Gy7p3nhUNGF9D34FmWYxyvewb6juiDNSVLXWTDvS"
    "__cfduid" => null
]

person Ali Tavafi    schedule 22.10.2019    source источник
comment
Я нашел проблему! Очередь файлов cookie для запросов API не включена по умолчанию. Вы можете добавить следующее в app/Http/Kernel.php: \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, в protected $middleware = [] или как промежуточное ПО в api.php   -  person Garrett    schedule 26.10.2019
comment
@Garrett Я уже добавил его в массив $middleware из app/Http/Kernel.php, а также передал его как параметр промежуточного программного обеспечения в route. Но это все еще не работает в первый раз, когда я вызываю API gmail.   -  person Ali Tavafi    schedule 26.10.2019
comment
Не могли бы вы поделиться своим выводом dd(Cookie::get()) ?   -  person Garrett    schedule 26.10.2019
comment
@Garrett, я отредактировал вопрос и добавил вывод dd(Cookie::get())   -  person Ali Tavafi    schedule 28.10.2019


Ответы (2)


Адрес сайта до и после входа в Gmail одинаков? Если URL-адрес изменился, файл cookie будет сброшен.

person MHZarei    schedule 30.10.2019

Laravel по умолчанию устанавливает параметр domain метода Cookie::make() в текущий адрес хоста, который содержит в себе www. поддомен. Как вы можете увидеть, вызвав метод getHost():

request()->getHost(); // returns e.g. www.yourdomain.com

Обратный URL-адрес, который я уже зарегистрировал в службе gmail, был mydomain.com/return/url. Я установил файл cookie, не передавая ему домен, поэтому был установлен адрес хоста по умолчанию, который отличается от зарегистрированного домена в gmail.

Я удалил предыдущий домен (mydomain.com/return/url) из gmail и зарегистрировал его с поддоменом www. (www.mydomain.com/return/url). Также я передал аргументы path и domain методу Cookie::make(), и он отлично работает ;) :

Cookie::queue(Cookie::forget('reserveID', '/', $request->getHost()));
Cookie::queue(Cookie::make('reserveID', $reserveID, 1440, '/', $request->getHost()));
person Ali Tavafi    schedule 30.10.2019