Мне интересно, как можно выполнить sh HTTP Basi c Аутентификация с помощью общего гнезда JS Практика аутентификации.
Например, если я использую AuthGuard, как это, я получаю ошибку
(node:336) UnhandledPromiseRejectionWarning: Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { compareSync } from 'bcrypt';
import { User } from 'src/user/user.entity';
import { Repository } from 'typeorm';
@Injectable()
export class AuthGuard implements CanActivate {
constructor(
@InjectRepository(User) private readonly userRepository: Repository<User>,
) {}
async canActivate(context: ExecutionContext): Promise<boolean> {
const request = context.switchToHttp().getRequest();
const b64auth = (request.headers.authorization || '').split(' ')[1] || '';
const [username, password] = Buffer.from(b64auth, 'base64')
.toString()
.split(':');
const user = await this.userRepository.findOne({
where: { username },
});
if (user && compareSync(password, user.password) !== false) {
request.user = user;
return true;
}
const response = context.switchToHttp().getResponse();
response.set('WWW-Authenticate', 'Basic realm="Authentication required."'); // change this
response.status(401).send();
return false;
}
}
Я подозреваю, что возвращение false (и разрешение Nest обработать ответ) не приводит к «ручному» установлению кода состояния ответа на 401 и отправке ответа.
Как я могу защитить определенные маршруты с помощью этого древнего механизма авторизации http?