Выход из сессии
Собственно, вопрос вот в чем: «Как организовать выход из приложения на стороне сервера?» Раньше я делал это следующим образом: я генерировал JWT-токен на сервере и передавал его на клиент, где он хранился в localStorage. Если пользователь выходил из приложения, токен удалялся из localStorage, и заголовок приходил пустым на сервер. Это означало, что сессия закончена.
Сейчас мне нужно реализовать функцию выхода из приложения на стороне сервера. Интернет предлагает использовать Redis, чтобы сохранять токен в черном списке, или куки, но я не могу разобраться, как это сделать. Ниже я покажу свой код для генерации токена и то, как я его обрабатываю.
Мои предположения такие: при регистрации или логине генерировать токен и куки, и где-то их хранить. Если на клиенте куки пустые, то пользователь считается вышедшим из приложения. При обработке маршрута 'logout' я должен удалять/очищать куки. Извините за, возможно, глупый вопрос. Как вы видите реализацию функции выхода из приложения на стороне сервера?
@Injectable()
export class JwtAuthGuard implements CanActivate {
constructor(private jwtService: JwtService) {}
canActivate(
context: ExecutionContext,
): boolean | Promise<boolean> | Observable<boolean> {
const req = context.switchToHttp().getRequest();
try {
const authHeader = req.headers.authorization;
if (!authHeader) {
return false;
}
const [bearer, token] = authHeader.split(' ');
if (bearer !== 'Bearer' || !token) {
throw new UnauthorizedException({
message: 'Пользователь не авторизован.',
});
}
const user = this.jwtService.verify(token);
req.user = user;
return true;
} catch (e) {
console.log(e);
throw new UnauthorizedException({
message: 'Пользователь не авторизован.',
});
}
}
}
Ниже будет сервис регистрации.Хотелось бы услышать как мне стоит изменить мой код, исходя из задания.
public async registration(userDto: CreateUserDto) {
const candidate = await this.userService.getUserByEmail(userDto.email);
if (candidate) {
throw new DuplicateException(
'Пользователь с таким email уже существует.',
);
}
const hashPassword = await bcrypt.hash(userDto.password, 3);
const user = await this.userService.createUser({
...userDto,
password: hashPassword,
});
return this.generateToken(user);
}