我正在使用 JWT 和刷新令牌。因为 JWT 会在短时间内过期,如果用户在受保护路由上获得 401 状态代码,我想刷新访问令牌,然后强制用户使用他们获得的新 JWT 令牌再次运行端点。
我知道它在前端是可行的,但我想知道是否可以在 Nestjs 中处理它。
您可以创建一个 Nestjs 中间件 拦截对受保护路由的每个请求并检查 JWT 令牌是否过期。如果令牌过期,中间件可以使用刷新令牌从身份验证服务器获取新的 JWT 令牌并将其设置在响应标头中。
例如:
@Injectable()
export class JwtRefreshMiddleware implements NestMiddleware {
constructor(private readonly authService: AuthService) {}
async use(req: Request, res: Response, next: () => void) {
const token = req.headers.authorization?.split(' ')[1];
if (token) {
try {
const decodedToken = jwt.verify(token, process.env.JWT_SECRET);
req.user = decodedToken;
next();
} catch (err) {
if (err.name === 'TokenExpiredError') {
try {
const refreshToken = req.cookies?.refreshToken;
const newToken = await this.authService.refreshToken(refreshToken);
res.setHeader('Authorization', `Bearer ${newToken}`);
next();
} catch (err) {
// handle error
}
} else {
// handle error
}
}
} else {
// handle error
}
}
}