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

Laravel 9 集成Passport无法生成有效accessToken问题求助

Laravel 9 Passport 登录返回令牌模型而非accessToken字符串修复方案

问题根因

该问题是User模型引入了错误的HasApiTokens trait导致:Laravel 9默认自带Sanctum认证包,默认引入的Laravel\Sanctum\HasApiTokens调用createToken()返回的是Sanctum的个人访问令牌模型实例,访问->accessToken属性不会返回Passport生成的明文凭据字符串,只会返回模型本身的结构化数据,和你遇到的响应表现完全一致。

修复操作

  • 替换User模型的trait引入
    打开app/Models/User.php,删除原有Sanctum的trait引用,替换为Passport提供的对应trait:
<?php

namespace App\Models;

// 移除默认的Sanctum trait引用
// use Laravel\Sanctum\HasApiTokens;
// 引入Passport的trait
use Laravel\Passport\HasApiTokens;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Illuminate\Database\Eloquent\Factories\HasFactory;

class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable;

    // 其余模型原有代码保持不变
}
  • 调整认证守卫配置
    打开config/auth.php,将api守卫的驱动修改为passport:
'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],

    'api' => [
        'driver' => 'passport', // 此处不能为默认的sanctum
        'provider' => 'users',
    ],
],
  • 验证修复结果
    完成上述修改后重启服务,重新调用登录接口,$user->createToken('Laravel Password Grant Client')->accessToken就会返回可直接用于接口认证的明文令牌字符串,正常响应格式示例:
{
    "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImp0aSI6IjMyYzUxOGNjZWJhNjNhNWM3NTk0NTg3ZGUzYzU4YjQwOWYx..."
}
  • 异常排查(可选)
    如果修改后仍无法正常返回令牌,确认已完成Passport基础配置:
    • 已执行php artisan passport:install生成接口签名所需的公私钥
    • 在app/Providers/AuthServiceProvider.php的boot()方法中已调用Passport::routes()注册Passport相关认证路由

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 06:54:30