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. Я сам изо всех сил пытаюсь понять, почему это так.

Другие вопросы по тегам