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

多租户环境下Laravel Passport个人访问令牌验证问题

问题解答:Laravel Passport跨子域Personal Access Token验证失败

Personal Access Token本身不与生成它的域名绑定,你的问题大概率出在实例间的配置一致性上,以下是具体排查方向和解决方法:

1. 确保所有实例的APP_KEY完全一致

Laravel的加密/解密逻辑依赖APP_KEY,Passport在处理令牌的签名、解密时会用到这个密钥。如果不同子域实例的APP_KEY不同,中央身份服务无法正确解析其他实例生成的令牌内容,直接导致验证失败。

  • 解决:从任意一个实例执行php artisan key:show获取当前有效APP_KEY,然后将这个值同步到所有其他实例的.env文件中。

2. 统一Passport的加密配置

检查config/passport.php中的encryption_key项:

  • 如果手动指定了该值,必须确保所有实例的这个配置完全相同;
  • 如果未手动指定,Passport会默认使用APP_KEY,此时回到第一点保证APP_KEY一致即可。

3. 确认所有实例使用同一个Personal Access Client

虽然共享数据库,但如果不同实例各自初始化了Personal Access Client(执行php artisan passport:client --personal),会在oauth_clients表中生成多条记录,导致不同实例生成的令牌关联不同的client_id。中央服务验证时,可能因客户端权限或匹配问题拒绝通过。

  • 解决:在所有实例的.env中添加以下配置,指定同一个Personal Access Client的ID和密钥(从oauth_clients表中对应记录获取):
    PASSPORT_PERSONAL_ACCESS_CLIENT_ID=你的client_id
    PASSPORT_PERSONAL_ACCESS_CLIENT_SECRET=你的client_secret
    

4. 验证身份验证中间件与Guard配置

  • 确保中央身份服务的API路由正确使用了auth:api中间件;
  • 检查所有实例的config/auth.php中,api guard的driver设置为passport:
    'guards' => [
        'api' => [
            'driver' => 'passport',
            'provider' => 'users',
        ],
    ],
    

5. 解码令牌对比内容

在生成令牌的实例和中央服务上,分别执行以下命令解码同一个令牌:

php artisan passport:decode 你的令牌字符串
  • 如果某一端解码失败,说明加密密钥不一致;
  • 如果解码内容一致但验证失败,排查中央服务的权限逻辑或中间件是否有额外的域名限制。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 00:00:09