Как я могу установить требование `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
);
}
}