аутентификация с использованием nestjs, паспорт со стратегией JWT
Я пытаюсь реализовать аутентификацию и авторизацию nestjs для приложения задач
Я использую стратегию JWT с паспортом
Но я не могу реализовать метод выхода из системы
Я попытался
@Get('/logout')
logout(@Request() req) {
req.logout();
}
он возвращает 200, но тогда я все еще могу получить данные с токеном для того же пользователя, который только что вышел из системы
мой файл jwt-стратегии
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;
}
}
в tasks.controller я использую его так
@Controller('tasks')
@UseGuards(AuthGuard('jwt'))
мой 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
2 ответа
Простой выход пользователя из системы не делает токен JWT недействительным (если срок действия токена не истек).
Чтобы убедиться, что токен недействителен после выхода из системы, вам необходимо применить некоторую дополнительную стратегию. Один из распространенных подходов - занесение токена в черный список и ведение списка токенов, занесенных в черный список.
Для этого при выходе из системы вы можете добавить токен в черный список и добавить его в черный список токенов. А при аутентификации вы можете добавить проверку, находится ли токен в черном списке, и соответственно выдать ошибку.
Проверьте этот ответ, чтобы узнать больше о решении этой проблемы: /questions/13973895/annulirovanie-veb-tokenov-json/13973921#13973921
То, что вы пытаетесь сделать, очень необычно, просто к вашему сведению.
Обычно вы просто удаляете токен в пользовательском LocalStorage
.
Вы можете перепрыгнуть через несколько обручей и занести токен в черный список, но это большая работа для того, что в большинстве случаев не требуется. Если вам нужна дополнительная безопасность, выберите более короткий срок действия токена.