問題

私はSC93jsアプリケーションを作成し、リクエストオブジェクト内のトークンとトークンペイロード内のユーザーを検証する認証ガードをミドルウェアで検証したいと考えています。

これを分割することで、私はきれいな分離を望んでいました。まず私のミドルウェア

 @Injectable()
export class TokenMiddleware implements NestMiddleware {
  use(req: any, res: Response, next: NextFunction) {
    try {
      const headers: IncomingHttpHeaders = req.headers;
      const authorization: string = headers.authorization;
      const bearerToken: string[] = authorization.split(' ');
      const token: string = bearerToken[1];

      // !! Check if token was invalidated !!

      req.token = token;
      req.tokenPayload = verifyToken(token);
      next();
    } catch (error) {
      throw new UnauthorizedException();
    }
  }
}
 

トークンのみを検証し、エンコードされたトークンとそのペイロードで要求オブジェクトを拡張します。私の認証ガード

 @Injectable()
export class AuthenticationGuard implements CanActivate {
  constructor(private readonly usersService: UsersService) {}

  async canActivate(context: ExecutionContext): Promise<boolean> {
    const request: any = context.switchToHttp().getRequest();

    try {
      const user: any = request.tokenPayload;

      if (!user) {
        throw new Error();
      }

      const findByIdDTO: FindByIdDTO = { id: user.id };
      const existingUser: UserRO = await this.usersService.findById(findByIdDTO);

      if (!existingUser) {
        throw new Error();
      }

      // attach the user to the request object?

      return true;
    } catch (error) {
      throw new UnauthorizedException();
    }
  }
}
 

このガードは、tokenpayload内の提供されたユーザーが有効なユーザーであるかどうかをチェックします。すべてが問題ない場合は、ユーザーをリクエストオブジェクトにどこにアタッチする必要がありますか?私が知る限り、ガードは何かが正しいかどうかをチェックするだけです。しかし、私はこのロジックをすべてトークンミドルウェアに保存したくありません。認証ガードで検証を終

  ベストアンサー

Passportに似たようなことをしたい場合は、常にNode.JSの世界でかなり標準的なティングと見なされるreq.userにユーザーを添付することができます。

あなたのための副次的な質問:2人のガードを持たない理由は何ですか?トークンがあることを確認するための1つのガードを持っていて、実際には有効なトークンであり、トークン上のユーザーを検証するためのものは実際に有効です。そうすれば、ミドルウェアを使用しない(互換性のためにほとんど含まれている)、まだ分離されたロジックを持っています。

  同じタグがついた質問を見る

javascriptnode.jstypescriptexpressnestjs