Laravel Socialite Google OAuth with Sanctum:已创建会话,但登录后 user_id 为空

问题描述 投票:0回答:1

我正在使用 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 请求中得到正确的身份验证?

任何有关如何解决此问题的见解将不胜感激!

php laravel laravel-sanctum laravel-socialite laravel-11
1个回答
0
投票

假设您使用的是 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
中间件。

© www.soinside.com 2019 - 2024. All rights reserved.