首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NestJS在jwt策略中包含WWW-Authenticate报头

NestJS在jwt策略中包含WWW-Authenticate报头
EN

Stack Overflow用户
提问于 2021-08-20 03:30:56
回答 1查看 103关注 0票数 0

我有一个有效的nestjs passport JWT策略,它返回一个401 unauthorized,带有无效的或缺少的持有者令牌,但是,它没有设置响应头WWW-Authenticate头,这是我需要为期望在头中的客户端库做的

在我的AuthModule中,我是这样注册的:

代码语言:javascript
复制
    JwtModule.register({
      secret: jwtConstants.secret,
      signOptions: { expiresIn: '1m' }
    })

我还建立了JWT策略,如下所示:

代码语言:javascript
复制
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标头?

EN

回答 1

Stack Overflow用户

发布于 2021-08-21 02:08:55

我设法用一种略微不同的方法解决了这个问题,你可以使用异常过滤器来拦截身份验证失败,这对我很有效,也许有人会发现它很有用:

代码语言:javascript
复制
@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中全局实现它,如下所示:

代码语言:javascript
复制
app.useGlobalFilters(new HttpExceptionFilter());
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68856704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档