Laravel Passport:/oauth路由正常但/api异常及前端请求授权问题
我来帮你梳理下这两个问题的可能原因和解决办法,我之前用Laravel Passport做项目时也踩过类似的坑😉
问题1:/oauth路由正常,但/api路由无法正常使用
首先得明确Passport保护API的核心逻辑:/oauth下的授权/管理路由和你的业务/api路由是两套不同的保护机制,出现这个问题大概率是你的/api路由的认证配置或者请求方式不对。
- 先检查路由配置:确保
routes/api.php里的目标路由已经加上了auth:api中间件,这是Passport识别API认证的关键标志,比如:
// routes/api.php Route::middleware('auth:api')->group(function () { Route::get('/user', function (Request $request) { return $request->user(); }); // 你的其他业务API路由 });
- 再检查请求头:调用/api路由时,必须在请求头里带上有效的
Authorization令牌,格式是Bearer {你的access_token}。如果用Axios的话,可以全局配置或者单个请求里设置:
// 全局配置示例(比如在Vue的main.js里) import axios from 'axios'; axios.defaults.headers.common['Authorization'] = `Bearer ${localStorage.getItem('access_token')}`;
- 验证token有效性:确保你的access token是通过
/oauth/token接口合法获取的,没有过期,且对应客户端的ID/密钥配置正确。
另外要注意:Laravel的web guard(默认Web登录)和api guard(Passport认证)是完全独立的会话体系,Web登录的session不会自动给/api路由授权,必须用Passport生成的token才行。
问题2:未登录时请求/oauth路由返回401,Web登录后正常
这个其实是Passport的设计预期,你混淆了Passport下两类不同的路由:
- OAuth2授权路由:比如
/oauth/token,这类是公开接口,不需要Web登录,只要传入正确的客户端ID、密钥、用户名密码就能拿到access token,是给前端/第三方应用获取授权用的。 - Passport管理路由:比如
/oauth/clients、/oauth/personal-access-tokens,这类是给后台管理员管理Passport客户端、令牌用的,默认用web中间件保护,必须先通过Laravel默认的Web登录(比如后台登录)才能访问。
如果你是前端Vue应用要调用API获取授权,应该用/oauth/token接口,而不是/oauth/clients这类管理接口。
补充验证步骤
如果还是有问题,可以做这几个排查:
- 确认User模型已经引入
HasApiTokenstrait:
// app/Models/User.php use Laravel\Passport\HasApiTokens; class User extends Authenticatable { use HasApiTokens, HasFactory, Notifiable; }
- 确认
AuthServiceProvider里已经注册了Passport路由:
// app/Providers/AuthServiceProvider.php public function boot() { $this->registerPolicies(); Passport::routes(); }
- 查看Laravel日志(
storage/logs/laravel.log),里面会有/api路由失败的具体原因,比如token无效、权限不足等,能帮你快速定位问题。
内容的提问来源于stack exchange,提问作者Michał
相关产品推荐
相关产品推荐

