使用nestJS进行身份验证,使用JWT策略的护照



我正在尝试为任务应用程序实现nestjs身份验证和授权

我正在将 JWT 策略与护照一起使用

但我无法实现注销方法

我试过了

@Get('/logout')
logout(@Request() req) {
req.logout();
}

它返回 200,但我仍然可以使用刚刚注销的同一用户的令牌获取数据

我的智威汤逊策略文件

import { Injectable, UnauthorizedException } from "@nestjs/common";
import { PassportStrategy } from '@nestjs/passport';
import { Strategy, ExtractJwt } from 'passport-jwt';
import { InjectRepository } from "@nestjs/typeorm";
import { UserRepository } from "./user.repository";
import { JwtPayload } from "./jwt-payload.interface";
import * as config from 'config';
const jwtConfig = config.get('jwt');
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
constructor(@InjectRepository(UserRepository) private userRepository: UserRepository) {
super({
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
secretOrKey: process.env.JWT_SECRET || jwtConfig.secret
})
}
async validate(payload: JwtPayload) {
const {username} = payload;
const user = await this.userRepository.findOne({username});
if(!user) {
throw new UnauthorizedException();
}
return user;
}
}

在任务控制器中,我是这样使用它的

@Controller('tasks')
@UseGuards(AuthGuard('jwt'))

My auth.module.ts

import { Module } from '@nestjs/common';
import { AuthController } from './auth.controller';
import { AuthService } from './auth.service';
import { TypeOrmModule } from '@nestjs/typeorm';
import { UserRepository } from './user.repository';
import { JwtModule } from '@nestjs/jwt';
import { PassportModule } from '@nestjs/passport';
import { JwtStrategy } from './jwt.strategy';
import * as config from 'config';
const jwtConfig = config.get('jwt');
@Module({
imports: [
PassportModule.register({defaultStrategy: 'jwt'}),
JwtModule.register({
secret: process.env.JWT_SECRET || jwtConfig.secret,
signOptions: {
expiresIn: jwtConfig.expiresIn
}
}),
TypeOrmModule.forFeature([UserRepository])
],
controllers: [AuthController],
providers: [
AuthService,
JwtStrategy
],
exports: [
JwtStrategy,
PassportModule
]
})
export class AuthModule { }

我希望能够注销用户,令牌应该无效并返回 401

仅注销用户不会使 JWT 令牌无效(除非令牌已过期(。

为了确保令牌在注销后无效,您需要应用一些额外的策略。一种常见的方法是将令牌列入黑名单并维护列入黑名单的令牌列表。

为此,您可以在注销时将令牌添加到黑名单中,并将其添加到列入黑名单的令牌列表中。在身份验证中,您可以添加检查令牌是否被列入黑名单并相应地抛出错误。

查看此答案以获取有关处理此问题的更多想法:https://stackoverflow.com/a/23089839/1906361

你想做的事情非常罕见,仅供参考。

通常,您只需删除用户LocalStorage中的令牌。

您可以跳过一些障碍并将令牌列入黑名单,但对于在大多数情况下没有必要的东西来说,这是很多工作。如果需要额外的安全性,请为令牌选择较短的到期时间。

最新更新