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

Laravel Passport生成的OAuth2令牌始终返回401未授权求助

碰到这种拿到令牌却还是返回401的情况真的挺闹心的,我帮你梳理几个最常见的排查方向,咱们一步步来定位问题:

1. 先确认请求头的令牌格式绝对正确

这是最容易踩坑的地方!你得确保请求头里的Authorization字段是**Bearer {你的令牌内容}**这个格式:

  • 别漏写前面的Bearer,注意后面要跟一个空格再放令牌
  • 用Postman/Insomnia的话,直接选「Authorization」标签,类型选「Bearer Token」后填入令牌就行,别手动在Headers里拼接,容易写错格式
  • 可以开启请求的「控制台」或「日志」,看看实际发送的请求头是不是完全符合要求
2. 检查Laravel的核心配置有没有到位

Passport的配置有几个关键环节,漏一个都会导致验证失败:

  • 打开config/auth.php,找到guards下的api项,确保driver是passport,而不是默认的token或session:
    'api' => [
        'driver' => 'passport',
        'provider' => 'users',
    ],
    
  • 检查app/Http/Kernel.php的$middlewareGroups里,api组有没有包含auth:api中间件:
    'api' => [
        'throttle:api',
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'auth:api', // 必须要有这个
    ],
    
  • 确认app/Providers/AuthServiceProvider.php的boot方法里调用了Passport::routes(),且这个服务提供者已被正确加载
3. 验证客户端凭证和授权类型匹配

不同的授权类型需要对应的客户端配置:

  • 如果用的是密码授权(需要传username/password+client_id/client_secret),必须用php artisan passport:client --password命令创建客户端,这种客户端在oauth_clients表中的password_client字段为1,普通客户端无法使用密码授权
  • 如果用的是客户端凭证授权,要确保请求/oauth/token时grant_type是client_credentials,且客户端支持该授权方式
  • 去数据库的oauth_clients表核对:你的client_id对应的secret和传入的一致,且revoked字段为0
4. 检查令牌本身的有效性

拿到令牌后,先确认它没过期、没被吊销:

  • 打开tinker工具(执行php artisan tinker),用以下命令检查:
    // 替换成你的令牌字符串
    $token = \Laravel\Passport\Token::findToken('你的令牌内容');
    
    // 查看过期时间和是否被吊销
    dd($token->expires_at, $token->revoked);
    
  • 如果你的路由用了scope中间件(比如Route::get('/test', 'TestController@index')->middleware('scope:view-data')),要确保生成令牌时包含了对应的权限范围,否则也会返回401
5. 服务器环境的隐性问题

Vagrant+Apache的环境可能藏着小坑:

  • 确认Apache开启了mod_rewrite模块,Laravel路由依赖它,否则令牌验证请求可能被路由规则拦截
  • 检查PHP的openssl扩展是否开启,Passport的令牌加密和解密都依赖这个,没开的话令牌生成后无法验证
  • 核对.env文件里的APP_URL是否和请求的API地址完全一致(比如你用http://homestead.test/api,APP_URL就要设成http://homestead.test),Passport会验证令牌的aud字段和APP_URL是否匹配
6. 最后几个容易忽略的细节
  • 确保测试路由定义在routes/api.php里,而不是web.php——web中间组默认用session认证,和Passport的token认证不兼容
  • Postman/Insomnia里如果开启了「SSL验证」,本地http环境要关掉,否则请求可能被阻断
  • 清除缓存:执行php artisan config:clear和php artisan cache:clear,有时候配置修改后没生效会导致验证失败

如果以上步骤都排查过还是有问题,可以试试创建一个只带auth:api中间件的最简测试路由,用正确的Bearer令牌请求,排除控制器代码的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:52:44