node.js - 如何使用 NestJS 完成 HTTP 基本身份验证
问题描述
我想知道如何使用常见的 NestJS 身份验证实践来完成 HTTP 基本身份验证。
例如,如果我使用这样的 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 授权机制保护某些路由?
解决方案
我建议实现一个ExceptionFilter
专门监听警卫抛出的异常的函数(UnauthorizedException
)。然后,在过滤器中,根据需要设置响应,这样守卫就不会尝试发送多个响应,您可以根据需要设置响应。
推荐阅读
- linux - 如何订购具有特定标准的文本文件?
- javascript - 从不同的节点插件方法多次调用 JS 函数
- gradle - Gradle 如何:从依赖项中解压缩 ZIP 文件中的 ZIP 文件,并保持增量构建功能
- laravel - Laravel 5.8 带有参数、DI 和模拟的上下文绑定永远不会起作用
- bash - 如何在 shell 中创建自己的 bash 命令选项
- python - 如何修复 Python 中的 ARIMA 模型错误
- angular - 如何知道我的 html 组件的翻译文件中的元素是否为空?
- sql - 用函数反转where子句,有可能吗?
- matlab - MATLAB:`vertcat` 反转(2D 到 3D)
- c# - 长期订阅 Rx 主题导致巨大的内存泄漏