护照策略中的访问响应



我正在使用nestJS和护照实现身份验证。

我有一个令牌,有效期为14天,refreshTime为15分钟(在有效负载内)。因此,如果用户在15分钟内提出请求,一切都会正常;但在那之后,它需要被刷新。我将jwt的签名存储在另一个表中,如果它存在,我创建一个新的令牌,如果不存在,我就抛出not authenticated异常。

这里是挑战:我需要将新创建的jwt令牌设置为响应头。

下面是我的代码:
// jwt.strategy.ts
import { ConfigService } from '@nestjs/config';
import { ExtractJwt, Strategy } from 'passport-jwt';
import { PassportStrategy } from '@nestjs/passport';
import { Injectable } from '@nestjs/common';
import { AuthService } from '../auth.service';
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
constructor(
private configService: ConfigService,
private authService: AuthService,
) {
super({
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
ignoreExpiration: false,
secretOrKey: configService.get('JWT_SECRET'),
passReqToCallback: true,
});
}
async validate(req: any, payload: any) {
const { refreshTime, sub, phoneNumber } = payload;
const tokenSignature = req.get('authorization').split('.').reverse()[0];
if (refreshTime < Date.now()) {
console.log('REFRESH');
this.authService.refreshToken(tokenSignature);
// **Set new token to response header**
}
return {
userId: sub,
phoneNumber,
tokenSignature,
};
}
}

我是nestJs的新手,实际上我不知道这是不是做这个的正确地方。

我应该创建一个拦截器之类的,或者甚至在authGuard内部处理这个?

我可以从AuthGuard传递响应对象:

// jwt-auth.guard.ts
import { ExecutionContext, Injectable } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
@Injectable()
export class JwtAuthGuard extends AuthGuard('jwt') {
canActivate(context: ExecutionContext) {
const http = context.switchToHttp();
const res = http.getResponse();
const req = http.getRequest();
req.res = res;
return super.canActivate(context);
}
}

相关内容

  • 没有找到相关文章

最新更新