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

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这类管理接口。


补充验证步骤

如果还是有问题,可以做这几个排查:

  1. 确认User模型已经引入HasApiTokens trait:
// app/Models/User.php
use Laravel\Passport\HasApiTokens;

class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable;
}
  1. 确认AuthServiceProvider里已经注册了Passport路由:
// app/Providers/AuthServiceProvider.php
public function boot()
{
    $this->registerPolicies();
    Passport::routes();
}
  1. 查看Laravel日志(storage/logs/laravel.log),里面会有/api路由失败的具体原因,比如token无效、权限不足等,能帮你快速定位问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:47:25