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

Laravel API无法读取认证服务器签发的Access Token问题求助

嘿,我之前也踩过Laravel Passport跨服务器认证的坑,给你梳理几个关键的排查方向和解决办法,应该能帮你搞定这个401的问题:

核心排查与修复步骤

1. 确保两台服务器的Passport核心配置完全一致

Passport依赖应用的APP_KEY来签名和解析Token,如果API服务器和认证服务器的密钥不匹配,肯定会解析失败返回401:

  • 把认证服务器.env文件中的APP_KEY原封不动复制到API服务器的.env里
  • 同时确认两台服务器对应客户端凭证模式的PASSPORT_CLIENT_ID和PASSPORT_CLIENT_SECRET完全相同

2. 检查API服务器的Passport初始化配置

API服务器虽然不负责生成Token,但必须正确配置Passport来验证Token:

  • 先在API服务器上运行php artisan passport:install,生成必要的加密密钥文件(如果已经从认证服务器复制了storage/oauth-*.key文件,也可以跳过这一步,但直接运行更稳妥)
  • 在AuthServiceProvider的boot方法中注册Passport路由(不需要完整的授权路由,只保留验证相关的也可以):
public function boot()
{
    $this->registerPolicies();

    // 注册Passport核心路由,用于Token验证
    Passport::routes();
}

3. 验证Token的传递是否正确

很多401问题都是因为Token没有被正确传递到API服务器:

  • 确保请求头里包含Authorization: Bearer {你的Access Token},注意Bearer和Token之间必须有一个空格
  • 如果API服务器是通过反向代理(比如Nginx)部署的,一定要在Nginx配置中添加proxy_set_header Authorization $http_authorization;,否则Authorization头会被丢失,导致API无法获取Token

4. 确认中间件配置无误

你提到已经在Kernel.php中定义了client中间件,要检查这个定义是否正确:

// app/Http/Kernel.php
protected $routeMiddleware = [
    // ... 其他中间件
    'client' => \Laravel\Passport\Http\Middleware\CheckClientCredentials::class,
    'scopes' => \Laravel\Passport\Http\Middleware\CheckScopes::class,
];

另外你的路由顺序是对的(先client中间件组,再给单个路由加scopes:x),但要确保生成Token时已经包含了x这个权限范围——不过你现在是401,所以先重点解决Token解析的问题,权限问题一般返回403。

5. 手动调试Token解析过程

可以在API服务器上写一个临时测试接口,手动解析Token来定位问题:

Route::get('/debug-token', function (\Illuminate\Http\Request $request) {
    $token = $request->bearerToken();
    
    if (!$token) {
        return response()->json(['error' => '请求中没有携带Token'], 401);
    }

    try {
        // 尝试解析Token
        $payload = \Laravel\Passport\Token::decode($token);
        return response()->json(['payload' => $payload]);
    } catch (\Exception $e) {
        return response()->json(['error' => 'Token解析失败: ' . $e->getMessage()], 401);
    }
});

调用这个接口,如果返回错误信息,就能直接知道是Token无效、签名错误还是其他问题。

6. 检查跨域CORS配置(如果涉及跨域请求)

如果你的前端是跨域请求API服务器,要确保CORS配置允许传递Authorization头:

// config/cors.php
return [
    'paths' => ['api/*'],
    'allowed_methods' => ['*'],
    'allowed_origins' => ['*'], // 生产环境一定要替换成具体的前端域名
    'allowed_headers' => ['Authorization', 'Content-Type'], // 必须包含Authorization
    'supports_credentials' => true,
];

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:29:12