Laravel 8 JWT如何自定义token的sub字段适配不同应用用户ID
解决方案
你之前的问题出在全局修改了getJWTIdentifier方法,导致所有生成的token的sub字段都被统一修改,只要拆分两种token的生成逻辑即可解决:
- 先还原User模型中的
getJWTIdentifier为默认实现,保证app1自用的token生成逻辑不受影响:
public function getJWTIdentifier() { return $this->getKey(); }
- 修改
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()]); }
- 修正
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.
相关产品推荐
相关产品推荐

