You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的HasApiTokens trait,没加的话调用createToken会报错
  • 检查是否已经执行过php artisan passport:install生成了加密密钥,密钥缺失会导致token生成失败
  • 检查config/auth.php里api guard的driver确实是passport,你当前的配置是对的无需修改

内容的提问来源于stack exchange,提问作者sp92

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 19:48:04