如何从不同租户nestjs多租户jwt识别jwt令牌

如何从不同租户nestjs多租户jwt识别jwt令牌,jwt,multi-tenant,nestjs,Jwt,Multi Tenant,Nestjs,我通过多个数据库实现多租户,并使用jwt令牌作为授权,我关心的是,当租户2的用户1登录并获得jwt令牌时,当他使用令牌访问另一个租户时,他是否识别为租户2的用户1?如果是这样的话,我们如何解决 我的策略 jwt.strategy.ts @可注射() 导出类JwtStrategy扩展了PassportStrategy(策略){ 建造师( 专用只读configService:configService, 私有只读moduleRef:moduleRef, ) { 超级({ jwtFromReques

我通过多个数据库实现多租户,并使用jwt令牌作为授权,我关心的是,当租户2的用户1登录并获得jwt令牌时,当他使用令牌访问另一个租户时,他是否识别为租户2的用户1?如果是这样的话,我们如何解决

我的策略

jwt.strategy.ts


@可注射()
导出类JwtStrategy扩展了PassportStrategy(策略){
建造师(
专用只读configService:configService,
私有只读moduleRef:moduleRef,
) {
超级({
jwtFromRequest:ExtractJwt.FromAuthHeaderAsberToken(),
passReqToCallback:正确,
secretrokey:configService.get('JWT\u SECRET\u KEY'),
});
}
异步验证(请求:请求,jwtPayload:jwtPayload){
const contextId=ContextIdFactory.getByRequest(请求);
const authService:authService=等待this.moduleRef.resolve(
AuthService,
上下文ID,
);
设{iat,exp}=jwtPayload;
常数timeDiff=exp-iat;

通常,如果(timeDiff,识别JWT有效域的正确方法是
aud
(或观众)字段。根据:

“aud”(受众)声明标识了JWT所属的接收者 拟用于。拟处理JWT的每个委托人必须 用受众声明中的值标识自己。如果主体 处理声明时,不会使用 “aud”索赔如果存在该索赔,则JWT必须 拒绝。在一般情况下,“aud”值是大小写数组- 敏感字符串,每个字符串都包含StringOrURI值 特殊情况下,当JWT有一个受众时,“aud”值可能是 包含StringOrURI值的单个区分大小写的字符串 受众价值观的解释通常是特定于应用的。 此声明的使用是可选的

在您的上下文中,您希望为每个租户选择唯一的受众(比如说
tenant1
tenant2
),在生成JWT时,您可以执行以下操作:

plainUser.aud=this.configService.get(“JWT\U租户”)
验证令牌时,您将引入一个检查,以确认
aud
声明与当前租户匹配

let{iat,exp,aud}=jwtPayload;
if(aud!==this.configService.get(“JWT_租户”)){
抛出新的UnauthorizedException();
}
//剩下的验证代码
注意我假设您将使用每个租户的不同配置运行应用程序的多个应用程序实例,但是如果租户来自其他地方,那么您应该从相关数据源收集这些信息


采用这种方式将确保您可以识别用户所属的用户和租户,并防止使用
tenant1
中的令牌访问
tenant2

是否要根据签名授权用户?为已签名令牌设置,并在验证时检查user@GuerricP是的,b因为这是一个多租户程序,如果租户a的用户id 1使用其令牌访问租户B,他将被识别为用户id 1,对吗?@Oluwafemi Sule,看起来是一个很好的解决方案?``const contextId=ContextIdFactory.getByRequest(请求);const tenancy:tenacyins=wait this.moduleRef.resolve(INJECTION_SCOPE,contextId,{strict:false},);if(parseInt(tenant.aud)!=tenancy.tenant.id){抛出新的UnauthorizedException();}```