Laravel Passport登录成功后Auth::check()返回false是什么原因?
问题原因
Passport 的 createToken() 方法仅负责生成合法的访问令牌,不会自动将用户实例挂载到当前请求的 Auth 门面中。你当前发送的登录请求本身没有携带有效 Token,使用 Passport 驱动的 api guard 会默认判定为未登录状态,所以 Auth::check() 返回 false 是符合设计逻辑的,不是代码运行异常。
解决方法
1. 当前登录请求需要获取登录状态
如果你需要在当前登录请求的生命周期内调用 Auth 相关方法获取用户信息,生成 Token 后手动设置认证用户即可:
public function login(Request $request) { $user = User::where('email', $request->email)->firstOrFail(); if (Hash::check($request->password, $user->password)) { $loginToken = $user->createToken('MyApp')->accessToken; // 手动挂载用户实例到当前请求的Auth门面 Auth::setUser($user); dd(Auth::check()); // 此处将返回true return response()->json([ 'message' => 'Successfully logged in', 'loginToken' => $loginToken ]); } return $this->sendError('Unauthorized.', ['error' => 'Unauthorized']); }
2. 后续接口请求正常识别登录状态
前端需要将登录接口返回的 loginToken 持久化存储,后续所有请求都要在请求头中携带该令牌,才能让 auth:api 中间件正常识别用户身份:
const handleSubmitLogin = (e) => { e.preventDefault(); let dataLogin = { 'email': email, 'password': password, }; // 原代码中这行没有赋值,属于无效代码可以直接删除 // JSON.stringify(dataLogin); axios.post('http://site.test/api/login', dataLogin) .then(resp => { console.log(resp); // 存储token到本地 localStorage.setItem('auth_token', resp.data.loginToken); // 给axios全局设置认证头,后续请求自动携带 axios.defaults.headers.common['Authorization'] = 'Bearer ' + resp.data.loginToken; history.push('/gallery'); }).catch(error => { console.log(error); }); setUserState('myState'); };
补充说明
你提供的 auth.php、api.php 配置本身没有问题,不需要修改。
内容的提问来源于stack exchange,提问作者sp92
相关产品推荐
相关产品推荐

