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

Laravel 8 JWT如何自定义token的sub字段适配不同应用用户ID

解决方案

你之前的问题出在全局修改了getJWTIdentifier方法,导致所有生成的token的sub字段都被统一修改,只要拆分两种token的生成逻辑即可解决:

  1. 先还原User模型中的getJWTIdentifier为默认实现,保证app1自用的token生成逻辑不受影响:
public function getJWTIdentifier()
{
    return $this->getKey();
}
  1. 修改autoload方法,给app2用的token手动指定sub字段为app2侧的用户ID。你用JWTFactory手动构造payload的场景下,不会触发User模型的getJWTIdentifier方法,sub的值完全可以自定义:
public function autoload()
{
    // 直接取你提前查询到的app2侧用户ID作为sub
    $app2UserId = session('app2UserId');
    $email = session('app2UserEmail');
    $payload = JWTFactory::sub($app2UserId)->email($email)->make();
    $token = JWTAuth::encode($payload);
    session(['app2UserToken' =>  $token->get()]);
}
  1. 修正createNewToken方法里的取值错误,你之前存app2 token的session键是app2UserToken,不是optisiloUserToken:
protected function createNewToken($token)
{
    return response()->json([
        'token' => $token, // app1自用token,sub为app1侧用户ID
        'access_token' => session('app2UserToken'), // 给app2用的token,sub为app2侧用户ID
        'token_type' => 'bearer',
        'expires_in' => Auth::factory()->getTTL() * 60,
        'user' => User::find(Auth::id())
    ]);
}

补充说明:如果app1和app2的JWT验签密钥不同,你需要在生成app2的token前临时切换jwt配置:config(['jwt.secret' => 'app2对应的JWT_SECRET值']),生成完成后再切回app1自己的密钥即可。

内容的提问来源于stack exchange,提问作者lidian manoha.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 15:54:03