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

Laravel 5.6集成Passport后API接口返回401未授权求助

Laravel 5.6 Passport API 401 Unauthorized 问题排查方案

看起来你已经按官方步骤走完了Passport的安装流程,但还是遇到了API路由返回401的问题,我来帮你梳理几个常见的排查点和解决办法:

先确认你已完成的配置(方便对照)

你提到的步骤我再整理下,确保没有遗漏:

  • 通过Composer安装了Laravel Passport
  • 执行了 php artisan passport:install 生成加密密钥和客户端
  • 在User模型中添加了HasApiTokens trait
  • 在AuthServiceProvider的boot方法中注册了Passport::routes()
  • 修改了config/auth.php的provider配置
  • 在web中间件组中加入了CreateFreshApiToken中间件

你的路由配置和请求头我也看过了,下面是具体的排查方向:


1. 检查config/auth.php的API Guard配置是否正确

这是最容易出错的点之一!确保api guard的driver设置为passport,而不是默认的token。正确的配置应该是这样:

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],

    'api' => [
        'driver' => 'passport', // 这里必须是passport,不是token!
        'provider' => 'users',
    ],
],

如果只是改了provider没改driver,Passport根本不会参与API的身份验证,自然会返回401。

2. 确认CreateFreshApiToken中间件的顺序

你已经把这个中间件加到了web组,但它必须放在StartSession中间件之后,因为它需要依赖会话来生成有效的API token。Laravel默认的web中间件组顺序应该是:

protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        // 这里放CreateFreshApiToken,不能在StartSession前面
        \Laravel\Passport\Http\Middleware\CreateFreshApiToken::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],
];

顺序错了的话,中间件无法获取到会话信息,生成的token自然无效。

3. 验证请求中的Token和Cookie是否有效

从你的请求头来看,你是通过前端web会话访问API的(带有laravel_session和X-XSRF-TOKEN),这时候需要:

  • 确保前端正确读取了XSRF-TOKEN cookie,并在请求头中发送了X-XSRF-TOKEN(你已经做到了,这点没问题)
  • 清除浏览器的缓存和所有Laravel相关的cookie,然后重新登录试试——有时候过期或签名错误的cookie会导致验证失败
  • 检查laravel_token cookie是否存在且有效,这个是CreateFreshApiToken生成的用于API验证的cookie

4. 确认User模型的HasApiTokens trait正确引入

别小看这个细节,很多人会忘记在类中使用这个trait:

use Laravel\Passport\HasApiTokens;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use HasApiTokens, Notifiable; // 必须包含HasApiTokens!
    // ... 其他模型代码
}

没有这个trait,Passport无法为用户关联token记录,验证自然通不过。

5. 检查Passport迁移是否成功执行

php artisan passport:install会自动运行迁移,但有时候可能因为权限或其他原因没执行。你可以手动运行:

php artisan migrate

然后检查数据库中是否存在oauth_clients、oauth_access_tokens、oauth_auth_codes这些Passport相关的表。如果没有,说明迁移失败,需要排查迁移文件的问题。

6. 极端情况:重新生成APP密钥

如果你的APP_KEY被修改过,可能会导致Passport的token签名验证失败。可以尝试:

php artisan key:generate

然后重新执行php artisan passport:install——注意这会重置所有现有的客户端和token,生产环境要谨慎操作。

7. 临时调试:在控制器中打印验证信息

你可以在ChatController@store方法开头加一行调试代码,看看是否能获取到用户:

public function store(Request $request)
{
    dd(auth('api')->user()); // 输出当前通过api guard验证的用户
    // ... 其他代码
}

如果输出null,说明验证确实没通过,回到前面的步骤排查;如果能输出用户信息,那可能是控制器里的其他逻辑导致的问题。


先从这些点开始排查,应该能解决大部分401的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:21:09