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
相关产品推荐
相关产品推荐

