Как я могу установить требование `sub` JWT в FeathersJS?

sub Претензия для JWT необязательна, но аутентификация feathersjs не позволит мне установить пустую строку или удалить ее.

Я смог добавить новое значение для полезной нагрузки в authentication до hook но меняется sub или попытка удалить это не работает.

app.service('/api/auth').hooks({
  before: {
    create: [
      // You can chain multiple strategies
      auth.hooks.authenticate(['jwt', 'local']),

      hook => {
        // I can add a new `SUB` value but this method doesn't work for `sub`
        Object.assign(hook.params.payload, {SUB: hook.params.payload.userId})
      }
    ],
...

Я попытался добавить то же самое изменение в after крюк, но это тоже не сработало. Имея sub значение как anonymous мне не кажется правильным Их документы даже говорят:

subject: 'anonymous', // Typically the entity id associated with the JWT

Тем не менее, кажется, нет простого способа сделать sub JWT претендует на динамическое значение.

2 ответа

subject или же sub устанавливается в параметрах аутентификации и - как и любой другой специфический параметр JWT - не может быть установлен через полезную нагрузку.

Глядя на код, вы видите, что действительные ключи опций JWT могут быть установлены через params (который кроме params.query находится вне зоны действия вредоносного клиента, поэтому его нельзя легко изменить):

app.service('/api/auth').hooks({
  before: {
    create: [
      // You can chain multiple strategies
      auth.hooks.authenticate(['jwt', 'local']),

      hook => {
        hook.params.jwt.subject = hook.params.payload.userId;
      }
    ],

Вы можете определить свой собственныйauthenticationStrategyпутем расширенияauthenticationServiceи используяgetTokenOptions()чтобы перезаписать подпрограмму полезной нагрузки, над которой вам нужно работать, а также как вы ее проверите.

Сценарий: я хотел зашифровать свою подписку, для этого я создал новуюAuthClassрасширениеAuthServiceи переопределение

      async getTokenOptions(
    authResult: AuthenticationResult,
    params: Params
  ): Promise<any> {
    const secret = this.app.get('authentication').secret;
    const { user } = authResult;
    const { id } = user;
    const payload = await super.getTokenOptions(authResult, params);
    if (user && user.id) {
      payload.subject = encrypt(id, secret);
    }
    return payload;
  }

а также мне нужно расшифровать во время его добавленияparams.user, поэтому я создал еще одинjwtDecryptStrategyрасширение данногоJWTStrategyи переопределить егоgetEntityId()чтобы вернуть расшифрованный идентификатор

Так:

      export class JwtDecryptStrategy extends JWTStrategy {
  async getEntityId(
    authResult: AuthenticationResult,
    _params: Params
  ): Promise<any> {
    return decrypt(
      authResult.authentication.payload.sub,
      this.app?.get('authentication').secret
    );
  }
}
Другие вопросы по тегам