我有一个 vue3 应用程序,它使用 Sanctum 对 Laravel 后端进行身份验证。
我的 Sanctum 后端验证工作流程如下所示:
Auth::login($user)
被调用,创建会话我正在尝试通过 Socialite 添加 Google 登录。 Socialte 文档中描述的工作流程是这样的:
public function redirect(): \Symfony\Component\HttpFoundation\RedirectResponse|\Illuminate\Http\RedirectResponse
{
return Socialite::driver('google')->redirect();
}
public function callback(Request $request): \Illuminate\Http\RedirectResponse|\Symfony\Component\HttpFoundation\RedirectResponse
{
session()->put('state', $request->input('state'));
$googleUser = Socialite::driver('google')->user();
// business-specific auth logic
Auth::login($user);
session()->regenerate();
// attempt to add cookie manually, does not work
$cookie = new Cookie(
session()->getName(),
session()->getId(),
config('session.lifetime'),
'/',
'.app.local',
false,
true,
false,
'lax'
);
return redirect('http://app.local/dashboard')->withCookie($cookie);
}
问题是此重定向不包含 Sanctum cookie。 Google 重定向到 API 后端,然后后端重定向回前端。因此,当前端加载时,客户端没有后续受保护的后端请求所需的 cookie,前端会重定向回登录屏幕。
我已经尝试了很多方法来实现这项工作,但我无法在这里找到解决方案。手动创建cookie似乎不起作用; Chrome 不会显示请求的标头。相反,它显示“显示临时标题”。
此问题可能是由于必须使用 ngrok URL 作为配置文件中的
redirect
值引起的。
Google 要求您使用公共 URL,因此我使用 NGROK url 作为回调 URL。这似乎剥夺了通过 Sanctum 进行身份验证所需的 cookie 的请求,从而使请求搁浅,无法将会话 ID 传递到后端。
推送到公共测试环境可以解决该问题。