Как создать JWT в Java с закодированным секретным base64 - PullRequest
1 голос
/ 22 сентября 2019

Использование онлайн-отладчика JWT для кодирования и декодирования токена JWT. Я создал этот простой токен

https://jwt.io/#debugger-io?token=eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImF1ZCI6IlNvbHIifQ.5T7L_L1MPfQ_5FjKGa1fTPqrzwK4bNSM812nW6oyjb8

Секрет кодирования токена:
qwertypassword

Заголовок { "alg": "HS256"}

Полезная нагрузка { "sub": "admin", "aud": "Solr"}

Когда вы кодируете секретом, не закодированным base64, он генерирует JWT eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImF1ZCI6IlNvbHIifQ.5T7L_L1MPfQ_5FjKGa1fTPqrzwK4bNSM812nW6oyjb8

Когда секрет закодирован в base64, он генерирует JWT eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImF1ZCI6IlNvbHIifQ.SWCJDd6B_m7xr_puQH-wgbxvXyJYXH9lTpldOU0eQKc

Вот код Java для генерации JWT, когда секрет не закодирован в base64.

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
public class JWTEncodeTest {
    public static void main(String[] args) {
        try {
            String secretkey="qwertypassword";

            //The JWT signature algorithm we will be using to sign the token
            String jwtToken = Jwts.builder()
                .setSubject("admin")
                .setAudience("Solr")
                .signWith(SignatureAlgorithm.HS256,secretkey.getBytes()).compact();

            System.out.println("jwtToken=");
            System.out.println(jwtToken);
        } catch (Exception e)
        {
            System.out.println(e.getMessage());
        }
    }
}

Что яотсутствует в этом Java-коде для генерации JWT с секретным base64, закодированным для получения значения JWT

eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImF1ZCI6IlNvbHIifQ.SWCJDd6B_m7xr_puQH-wgbxvXyJYXH9lTpldOU0eQKc

Ответы [ 2 ]

0 голосов
/ 24 сентября 2019

Вот код для решения, которое работало для меня, на основе обратной связи JPS

import io.jsonwebtoken.SignatureAlgorithm;    
import io.jsonwebtoken.Jwts;
import java.util.Base64;


public class JWT {

    public static void main(String[] args) {
        try {
            String secretkey="qwertypassword";
            byte[] decodedSecret = Base64.getDecoder().decode(secretkey);

            //The JWT signature algorithm we will be using to sign the token
            String jwtToken = Jwts.builder()
                .setSubject("admin")
                .setAudience("Solr")
                .signWith(SignatureAlgorithm.HS256,decodedSecret).compact();

            System.out.println("jwtToken=");
            System.out.println(jwtToken);
        } catch (Exception e)
        {
            System.out.println(e.getMessage());
        }
    }
}

Значение ключа JWT является ожидаемымSWCJDd6B_m7xr_puQH-wgbxvXyJYXH9lTpldOU0eQKc

, что сайт https://jwt.io/#debugger-io?token=eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImF1ZCI6IlNvbHIifQ.5T7L_L1MPfQ_5FjKGa1fTPqrzwK4bNSM812nW6oyjb8

производит.

0 голосов
/ 22 сентября 2019

Значение secret base64 encoded для jwt.io на самом деле означает, что он обрабатывает предоставленный вами секрет как закодированный base64 и, следовательно, сначала декодирует его, прежде чем он фактически используется.Смысл не в том, чтобы создать что-то другое, а просто в том, чтобы расшифровать секрет при его кодировании.

Секрет, который вы использовали, в ясном виде, не закодирован форма:

qwertypassword

Когда вы base64 кодируете его, например.с помощью https://www.base64encode.org/, вы получите это как закодированное base64 значение:

cXdlcnR5cGFzc3dvcmQ =

On jwt.io Вы можете использовать обе формы:

  • первая, не закодированная одна с снятым флажком base64 encoded secret

    или

  • второй, base64 кодированный один с установленным флажком .

В обоих случаях вы получите один и тот же результат.

Для вашего Java-кода потребуется дополнительный шаг для декодирования закодированного секрета, прежде чем использовать его для подписи:

import java.util.Base64;

String base64EncodedSecret = "cXdlcnR5cGFzc3dvcmQ=";
byte[] decodedSecret = Base64.getDecoder().decode(base64EncodedSecret);

, а затемкогда вы создаете JWT, вы используете расшифрованный секрет:

.signWith(SignatureAlgorithm.HS256, decodedSecret)

Но это необходимо только в том случае, если вы по какой-то причине получаете секрет в зашифрованном виде.

...