Gmail 登录后 Cookie 被删除

Ali*_*afi 6 php cookies laravel laravel-socialite

我正在使用 Laravel Framework 5.6 版实现在线预订系统并Laravel Socialite实现 gmail 登录。

\n\n

我有一个方法可以在预订之前检查用户是否登录,或者通过 redis 和 cookie 放置reserveDataredirectUrl指定uniqid以在登录后获取它:

\n\n
public function checkAuthentication(Request $request)\n{\n    $reserveData = json_decode($request->input(\'reserveData\'), true);\n    Session::put(\'reserveData\', $reserveData);\n\n    if (!Auth::check()) {\n        $reserveID = uniqid();\n        Cookie::queue(Cookie::forget(\'reserveID\'));\n        Cookie::queue(Cookie::make(\'reserveID\', $reserveID, 1440));\n\n        $stepData = [\n            \'redirectUrl\' => route(\'reserve\', [\'productId\' => $reserveData[\'productId\']]),\n            \'reserveData\' => $reserveData\n        ];\n\n        Redis::set($reserveID, serialize($stepData));\n\n        return redirect()->route(\'redirectToGmail\');\n    }\n\n    return redirect()->route(\'reserve\', [\'productId\' => $reserveData[\'productId\']]);\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

重定向到Gmail

\n\n
public function redirectToGmail()\n{\n    return Socialite::driver(\'google\')->redirect();\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

问题是,仅在用户第一次尝试登录时uniqid从 gmail 返回后,cookie 中不存在:

\n\n
public function login()\n{\n    $user = Socialite::driver(\'google\')->stateless()->user();\n    dd(Cookie::get());\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是我dd(Cookie::get());从 gmail 返回后的输出:

\n\n
array:4 [\xe2\x96\xbc\n    "XSRF-TOKEN" => "DxiHpLSqB8juOkdLSptORyXs2XGggwWuY4tKJDkz"\n    "project_session" => "Gy7p3nhUNGF9D34FmWYxyvewb6juiDNSVLXWTDvS"\n    "__cfduid" => null\n]\n
Run Code Online (Sandbox Code Playgroud)\n

Ali*_*afi 2

Laravel 默认情况下将方法domain的参数设置Cookie::make()为当前主机地址,其中包含www.子域。通过调用getHost()方法可以看到:

request()->getHost(); // returns e.g. www.yourdomain.com
Run Code Online (Sandbox Code Playgroud)

我已经在 gmail 服务中注册的返回网址是mydomain.com/return/url。我设置了 cookie,但没有向其传递任何域,因此设置的默认主机地址与 gmail 中的注册域不同。

我从 gmail 中删除了以前的域 (​​mydomain.com/return/url) 并将其注册为www.子域 (www.mydomain.com/return/url)。另外,我将pathdomain参数传递给Cookie::make()方法,它的工作方式就像一个魅力;)

Cookie::queue(Cookie::forget('reserveID', '/', $request->getHost()));
Cookie::queue(Cookie::make('reserveID', $reserveID, 1440, '/', $request->getHost()));
Run Code Online (Sandbox Code Playgroud)