我有一个有效的nestjs passport JWT策略,它返回一个401 unauthorized,带有无效的或缺少的持有者令牌,但是,它没有设置响应头WWW-Authenticate头,这是我需要为期望在头中的客户端库做的
在我的AuthModule中,我是这样注册的:
JwtModule.register({
secret: jwtConstants.secret,
signOptions: { expiresIn: '1m' }
})我还建立了JWT策略,如下所示:
import { ExtractJwt, Strategy } from 'passport-jwt';
import { jwtConstants } from './constants';
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
constructor() {
super({
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
ignoreExpiration: false,
secretOrKey: jwtConstants.secret,
});
}
validate(payload: {
sub: string;
email: string;
}): { userId: string; email: string } {
return {
userId: payload.sub,
email: payload.email
};
}
}只有在策略失败/返回401的情况下,我才能设置WWW-Authenticate标头?
发布于 2021-08-21 02:08:55
我设法用一种略微不同的方法解决了这个问题,你可以使用异常过滤器来拦截身份验证失败,这对我很有效,也许有人会发现它很有用:
@Catch(HttpException)
export class HttpExceptionFilter implements ExceptionFilter {
constructor() {}
catch(exception: HttpException, host: ArgumentsHost) {
const ctx = host.switchToHttp();
const response = ctx.getResponse<Response>();
const status = exception.getStatus();
if (status === 401) {
response.setHeader(
'WWW-Authenticate',
'Basic realm="Access to site", charset="UTF-8"',
);
}
response.status(status).json(exception.getResponse());
}
}然后我可以在我的main.ts中全局实现它,如下所示:
app.useGlobalFilters(new HttpExceptionFilter());https://stackoverflow.com/questions/68856704
复制相似问题