JWT/KONG: невозможно создать JWT с общим секретом
Я играю вокруг KONG API шлюза в последнее время.
Я хочу подписать каждый JWT с секретом, который является общим для всех микро. Мне это нужно, потому что я хочу, чтобы другие микро-устройства могли декодировать данные JWT, извлекать данные полезной нагрузки и работать с ними (например, поле _user_id_ в полезной нагрузке).
Когда я пытаюсь создать JWT для первого потребителя, он работает просто отлично. Но когда я пытаюсь создать его для второго потребителя, я получаю следующую ошибку:
{u'secret': u"already exists with value 'secret'}
Я не совсем уверен, но я думаю, что KONG/JWT требует уникальный секрет для каждого потребителя, чтобы создать JWT. Можно ли правильно настроить плагин JWT, чтобы иметь возможность использовать общий секрет для подписи JWT?
PS: я не совсем уверен, что использование общего секрета является хорошей практикой. Если есть лучший способ сделать это, пожалуйста, дайте мне знать. Спасибо!
- Конг версия
v0.10.2
2 ответа
Вы можете использовать метод подписи закрытого-открытого ключа.
Создайте свой токен JWT с закрытым ключом и поделитесь открытым ключом со всеми другими микросервисами. Другие микросервисы могут проверять подпись токена с помощью общего открытого ключа.
Вы можете использовать алгоритм RSA для генерации ключей и подписи токенов. Закрытый ключ должен быть только с сервисом, который генерирует токен.
Фрагмент для генерации ключей:
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(2048);
KeyPair kp = kpg.genKeyPair();
Key publicKey = kp.getPublic();
Key privateKey = kp.getPrivate();
Фрагмент для генерации токена JWT. Я использую JJwt API для генерации токена:
Jwts.builder()
.setClaims(payload)
.setExpiration(expiryDate)
.signWith(SignatureAlgorithm.RS256, privateKey )
.compact();
Фрагмент для проверки токена с открытым ключом:
Jwts.parser()
.setSigningKey(publicKey )
.parseClaimsJws(jwtToken)
Надеюсь это поможет.
Ваша проблема в том, чтоkey
в настройках секрета JWT должны быть уникальными для всех потребителей, см. вышестоящую проблему: https://github.com/Kong/kong/issues/1512
Кажется, сейчас не существует способа преодолеть это ограничение с помощью плагина JWT. Я сам изо всех сил пытаюсь понять, почему это так.