如果用户在 Nestjs 中的所有端点都获得 401 状态代码,如何运行代码

问题描述 投票:0回答:1

我正在使用 JWT 和刷新令牌。因为 JWT 会在短时间内过期,如果用户在受保护路由上获得 401 状态代码,我想刷新访问令牌,然后强制用户使用他们获得的新 JWT 令牌再次运行端点。

我知道它在前端是可行的,但我想知道是否可以在 Nestjs 中处理它。

jwt nestjs refresh-token
1个回答
0
投票

您可以创建一个 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
    }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.