Я использую мультитенант для нескольких баз данных и использую токен jwt в качестве авторизации, меня беспокоит то, что когда пользователь 1 арендатора 2 входит в систему и получает токен jwt, когда он использует токен для доступа к другому арендатору, он распознается как пользователь 1 арендатора 2? Если да, то как мы можем это исправить?
Моя стратегия
jwt.strategy.ts
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
constructor(
private readonly configService: ConfigService,
private readonly moduleRef: ModuleRef,
) {
super({
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
passReqToCallback: true,
secretOrKey: configService.get('JWT_SECRET_KEY'),
});
}
async validate(request: Request, jwtPayload: JwtPayload) {
const contextId = ContextIdFactory.getByRequest(request);
const authService: AuthService = await this.moduleRef.resolve(
AuthService,
contextId,
);
let { iat, exp } = jwtPayload;
const timeDiff = exp - iat;
if (timeDiff <= 0) {
throw new UnauthorizedException();
}
return jwtPayload;
}
}
Моя служба аутентификации
auth.service.ts
@Injectable({ scope: Scope.REQUEST })
export class AuthService {
constructor(
private readonly jwtService: JwtService,
private readonly configService: ConfigService,
private readonly userService: UsersService,
private readonly auctionHouseService: AuctionHouseService,
) {}
async createToken(user: User) {
let plainUser: any = Object.assign({}, user);
plainUser.auctionHouseId = (
await this.auctionHouseService.getCurrentAuctionHouse()
).id;
return {
expiresIn: this.configService.get('JWT_EXPIRATION_TIME'),
accessToken: this.jwtService.sign(plainUser),
};
}
}
Контроллер My Login
auth.controller.ts
@Controller('api/auth')
@ApiUseTags('authentication')
export class AuthController {
constructor(
private readonly authService: AuthService,
private readonly userService: UsersService,
) {}
@Post('login')
@ApiResponse({ status: 201, description: 'Successful Login' })
@ApiResponse({ status: 400, description: 'Bad Request' })
@ApiResponse({ status: 401, description: 'Unauthorized' })
async login(@Body() payload: LoginPayload, @Req() req): Promise<any> {
let user = await this.authService.validateUser(payload);
return omitPassword(await this.authService.createToken(user));
}