我正在使用 Laravel Sanctum 和 Nuxt3 构建一个仅 API 的 SPA,使用基于 cookie 的会话身份验证。我已经使用 Laravel Socialite 实现了 Google OAuth。
这是我当前的 Google OAuth 流程设置:
public function googleCallback()
{
$googleUser = Socialite::driver('google')->stateless()->user();
$user = $this->authRepository->show($googleUser->email);
if (!$user) {
$request = (object)[
'email' => $googleUser->getEmail(),
'password' => Str::random(40)
];
$user = $this->authService->register($request);
}
session()->regenerate();
Auth::login($user);
return redirect('http://localhost:3000/auth/callback?authStatus=' . true . '&email=' . urlencode($user->email));
}
public function googleRedirect()
{
$redirectUrl = Socialite::driver('google')->redirect()->getTargetUrl();
return response()->json(['redirect_url' => $redirectUrl]);
}
api.php:
Route::group(['prefix' => 'v2/auth'], function () {
Route::get('google/callback', [SocialiteController::class, 'googleCallback']);
Route::get('google/redirect', [SocialiteController::class, 'googleRedirect']);
});
流程似乎有效:我能够获取用户的 Google 个人资料数据并理论上将其登录。但是,在检查会话表时,我注意到创建了一个会话,但 user_id 字段为空。因此,我的前端中间件在调用 /api/user 时立即将用户标记为未经授权。什么可能导致会话中的 user_id 为空,以及如何确保用户在后续 API 请求中得到正确的身份验证?
任何有关如何解决此问题的见解将不胜感激!
假设您使用的是 React (http://localhost:300),您需要在请求标头中传递
X-XSRF-TOKEN
cookie。这将选择成功身份验证时生成的会话 cookie。
axiosInstanceHeaders(multipart: boolean = false) {
const xsrfToken = CookieServices.get('XSRF-TOKEN')
const contentType = multipart === true
? 'multipart/form-data'
: 'application/json'
return {
headers: {
'X-XSRF-TOKEN': xsrfToken,
'Content-Type': contentType,
}
}
}
另外,不要忘记在受保护的路由上添加
auth:sanctum
中间件。