Гнездо js + Паспорт: запретить пользователю 1 доступ к информации пользователя 2 - PullRequest
0 голосов
/ 18 апреля 2020

Как я могу запретить пользователю 1 доступ к информации пользователя 2 с помощью паспорта в приложении Nes js?

У меня уже есть 2 стратегии:

  • локальная стратегия, которая проверяет пользователя по электронной почте / паролю. Маршрут, защищенный этой стратегией, возвращает токен jwt.

  • стратегия jwt, которая проверяет данный токен jwt.

Теперь я хочу ограничить доступ к таким маршрутам, как users/:id, к токену jwt, который фактически имеет зашифрованный userId .

Как это сделать?

1 Ответ

0 голосов
/ 18 апреля 2020

РЕДАКТИРОВАТЬ

Я микшировал Аутентификация и Авторизация : что я хочу достичь, это авторизация после проверки подлинности использования .

Я должен был использовать Guard:

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:

@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 };
  }
}

Обратите внимание, как я передаю пользовательское имя 'own' как второй параметр PassportStrategy, чтобы отличить его от 'jwt'. Его охрана:

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

Это работает, но мне интересно, если это хороший способ сделать это ...

Что если позже я захочу изменить пользователя для пользователей с правами администратора?

Должен ли я создать четвертую стратегию, которая проверяет, если role === Role.ADMIN || req.params.id === payload.sub?

Я думаю, что я что-то упустил. Должен быть способ создать стратегию, которая проверяет только jwt, другую - только userId , другую - только роль, и объединять их, как я хочу, применяя охрану к моим маршрутам.

...