Laravel 8 集成Passport开发API 携带api_token访问受保护路由报Unauthenticated错误
核心问题与解决方案
1. Passport核心配置缺失
当前AuthServiceProvider的boot方法未注册Passport的认证逻辑,导致auth:api中间件无法识别Passport的令牌校验流程,是这类未认证错误的最常见诱因。
修复步骤:
- 引入Passport门面:在AuthServiceProvider顶部添加
use Laravel\Passport\Passport; - 在boot方法中添加路由注册逻辑:
public function boot() { $this->registerPolicies(); // 启用Passport认证路由 Passport::routes(); }
- 检查
config/auth.php的守卫配置,确保api守卫的驱动设置为passport,而非默认的token:
'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'api' => [ 'driver' => 'passport', 'provider' => 'users', ], ],
2. 两套认证体系冲突
当前User模型同时混用了Laravel原生简单API令牌的字段配置和Passport的trait逻辑,会导致认证校验逻辑完全错乱:
- 原生简单令牌的校验逻辑是直接查询用户表的
api_token字段,和Passport的令牌存储逻辑(存在oauth_access_tokens数据表)完全独立 - 如果注册接口手动生成随机串存入用户表的
api_token字段、并把这个值返回给前端,哪怕前端正确加了Bearer前缀,Passport驱动也根本不会校验这个值,自然返回未认证
修复方向: - 从User模型的
$fillable、$hidden数组中移除api_token字段,避免和Passport逻辑混淆 - 严格走Passport的令牌生成流程:用户认证通过后,调用
$user->createToken('client-name')->accessToken生成令牌串返回给前端,这类生成的令牌会被Passport驱动正常校验
3. 其他高频排查点
- 确保已经执行过
php artisan passport:install,生成Passport所需的加密密钥和默认客户端凭证,否则令牌的签发、校验全流程无法正常工作 - 补全路由分组的缺失收尾括号:当前贴出的路由代码中,
auth:api中间件分组的闭包少了一个闭合的});,会直接导致路由解析异常 - 修改配置后执行
php artisan config:clear、php artisan route:clear清除缓存,确保新的配置被框架加载 - 检查Postman的Authorization头格式:严格遵循
Bearer 令牌串的格式,不要在值中带入多余的空格、换行、引号符号
内容的提问来源于stack exchange,提问作者user9277271
相关产品推荐
相关产品推荐

