2

Nesjsアプリでパスポートを使用してユーザー1がユーザー2の情報にアクセスできないようにするにはどうすればよいですか?

私はすでに2つの戦略を持っています:

  • 電子メール/パスワードでユーザーを検証するローカル戦略。この戦略によって保護されたルートは、jwt トークンを返します。

  • 指定された jwt トークンを検証する jwt 戦略。

ここで、実際に暗号化された同じuserIdusers/:idを持つ jwt トークンなどのルートへのアクセスを制限したいと考えています。

どうやってするか ?

4

2 に答える 2

3

編集

私はAuthenticationAuthorizationを混ぜていました:私が達成したいのは、ユーザーが認証された後の承認です。

ガードを使用する必要がありました:

own.guard.ts

@Injectable()
export class OwnGuard implements CanActivate {
  canActivate(context: ExecutionContext): boolean {
    const req = context.switchToHttp().getRequest();
    return req.user.id === req.params.id;
  }
}

次に、ルートで使用します。

@Get(':id')
@UseGuards(OwnGuard)
async get(@Param('id') id: string) {
  return await this.usersService.get(id);
}

元の答え

私がしたことは、jwt の戦略に基づいて 3 番目の戦略を作成することでした。

@Injectable()
export class OwnStrategy extends PassportStrategy(Strategy, 'own') {
  constructor() {
    super({
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      secretOrKey: SECRET,
      passReqToCallback: true
    });
  }

  async validate(req: Request, payload: { sub: string }) {
    if (req.params.id !== payload.sub) {
      throw new UnauthorizedException();
    }
    return { userId: payload.sub };
  }
}

PassportStrategy「jwt」と区別するために、カスタム名「own」を の 2 番目のパラメータとして渡す方法に注意してください。そのガード:

@Injectable()
export class OwnAuthGuard extends AuthGuard('own') {}

これは機能しますが、それが良い方法なのだろうか...

後で管理者ユーザーのユーザー変更を可能にしたい場合はどうすればよいですか?

をチェックする 4 番目の戦略を作成する必要がありますrole === Role.ADMIN || req.params.id === payload.subか?

私は何かが欠けていると思います。jwt のみ、別のものはuserIdのみ、別のものはロールのみを検証する戦略を作成し、ルートにガードを適用するときに必要に応じてそれらを組み合わせる方法があるはずです。

于 2020-04-18T16:55:36.923 に答える