Laravel Passport生成auth token但auth用户对象不显示该字段问题
问题根因分析
- 你用
auth('web')->user()打印看不到token不属于bug:当前通过Auth::guard('web')->attempt()拿到的用户实例是web guard从session驱动读取的,调用createToken()生成的token仅会写入oauth相关数据表,不会自动挂载到当前已经实例化的user对象上,所以dump用户实例的时候看不到token属于正常现象,单独打印$loginToken能拿到就说明生成逻辑没问题。 - 切换
auth('api')->user()报500的核心原因:passport驱动的api guard本身不支持attempt()方法,这个方法只有session驱动的web guard才有,直接在登录逻辑里调用api guard的attempt会抛出方法不存在的异常,自然触发500错误。 - 额外的逻辑问题:你既然项目核心走api.php路由、用passport做鉴权,完全没必要用web guard做登录校验,web guard依赖session,api接口大多是无状态的,用session不符合api场景的设计规范。
优化后的登录逻辑
直接用Auth门面校验用户凭证,不需要走web guard:
public function login(Request $request) { $credentials = $request->only('email', 'password'); if (!Auth::validate($credentials)) { return $this->sendError('Unauthorized.', ['error' => 'Unauthorized']); } $user = Auth::getLastAttempted(); $loginToken = $user->createToken('MyApp')->accessToken; return response()->json([ 'message' => 'Successfully logged in', 'loginToken' => $loginToken, 'user' => $user ]); }
后续接口鉴权规范
后续需要登录态的api接口,只要在api.php里加上auth:api中间件,就能正常用auth('api')->user()拿到当前登录的用户信息,示例路由:
// api.php Route::middleware('auth:api')->get('/user', function (Request $request) { return $request->user(); });
调用上述接口的时候,请求头里带上Authorization: Bearer 你的登录token就能正常获取用户信息,不会报500。
可选排查项
如果还有500错误可以按以下顺序排查:
- 检查User模型有没有引入Passport的
HasApiTokenstrait,没加的话调用createToken会报错 - 检查是否已经执行过
php artisan passport:install生成了加密密钥,密钥缺失会导致token生成失败 - 检查
config/auth.php里api guard的driver确实是passport,你当前的配置是对的无需修改
内容的提问来源于stack exchange,提问作者sp92
相关产品推荐
相关产品推荐

