Как декодировать JWT (заголовок и тело) в Java с помощью кодека Apache Commons?

Я ищу расшифровать следующее JWT с помощью Apache Commons Codec, Как мы можем это сделать?

    eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0ZXN0Iiwicm9sZXMiOiJST0xFX0FETUlOIiwiaXNzIjoibXlzZ
WxmIiwiZXhwIjoxNDcxMDg2MzgxfQ.1EI2haSz9aMsHjFUXNVz2Z4mtC0nMdZo6bo3-x-aRpw

Это должно восстановить Header, Body а также Signature часть. Какой код?

3 ответа

Решение

Ну вот:

import org.apache.commons.codec.binary.Base64;
@Test
    public void testDecodeJWT(){
        String jwtToken = "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0ZXN0Iiwicm9sZXMiOiJST0xFX0FETUlOIiwiaXNzIjoibXlzZWxmIiwiZXhwIjoxNDcxMDg2MzgxfQ.1EI2haSz9aMsHjFUXNVz2Z4mtC0nMdZo6bo3-x-aRpw";
        System.out.println("------------ Decode JWT ------------");
        String[] split_string = jwtToken.split("\\.");
        String base64EncodedHeader = split_string[0];
        String base64EncodedBody = split_string[1];
        String base64EncodedSignature = split_string[2];

        System.out.println("~~~~~~~~~ JWT Header ~~~~~~~");
        Base64 base64Url = new Base64(true);
        String header = new String(base64Url.decode(base64EncodedHeader));
        System.out.println("JWT Header : " + header);


        System.out.println("~~~~~~~~~ JWT Body ~~~~~~~");
        String body = new String(base64Url.decode(base64EncodedBody));
        System.out.println("JWT Body : "+body);        
    }

Выход ниже:

------------ Decode JWT ------------
~~~~~~~~~ JWT Header ~~~~~~~
JWT Header : {"alg":"HS256"}
~~~~~~~~~ JWT Body ~~~~~~~
JWT Body : {"sub":"test","roles":"ROLE_ADMIN","iss":"myself","exp":1471086381}

Вот способ импорта не из пакета:

            java.util.Base64.Decoder decoder = java.util.Base64.getUrlDecoder();
            String[] parts = jwtToken.split("\\."); // split out the "parts" (header, payload and signature)

            String headerJson = new String(decoder.decode(parts[0]));
            String payloadJson = new String(decoder.decode(parts[1]));
            //String signatureJson = new String(decoder.decode(parts[2]));

REGARDLESS (этой альтернативы org.apache.commons.codec.binary.Base64)... вы также можете отправить эти фрагменты json в pojo.

Затем вы можете взять эти фрагменты JSON и превратить их в Pojo.

Заголовки являются "динамическими", поэтому вы, вероятно, захотите преобразовать их в пары Key Value (также называемые "Map" в Java).

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.util.Map;

public class JwtTokenHeaders {

    private final Map<String, Object> jsonMap; // = new HashMap<String, Object>();

    public JwtTokenHeaders(String jsonString) {

        ObjectMapper mapper = new ObjectMapper();
        //String jsonString = "{\"name\":\"JavaInterviewPoint\", \"department\":\"blogging\"}";

        //Map<String, Object> jsonMap = new HashMap<String, Object>();
        try {
            // convert JSON string to Map
            this.jsonMap = mapper.readValue(jsonString,
                    new TypeReference<Map<String, String>>() {
                    });
        } catch (Exception ex) {
            throw new RuntimeException(ex);
        }
    }

    @Override
    public String toString() {
        return org.apache.commons.lang3.builder.ToStringBuilder.reflectionToString(this);
    }
}

полезная нагрузка более статична, так что вы можете отобразить в pojo..... вы можете взять json и создать соответствующее pojo здесь:

http://pojo.sodhanalibrary.com/

что вы делаете это.. (создать MyPojo с онлайн-инструментом)

что-то вроде этого:

//import com.fasterxml.jackson.databind.DeserializationFeature;
//import com.fasterxml.jackson.databind.ObjectMapper;
            ObjectMapper mapper = new ObjectMapper();
            mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
            MyPojo tp = mapper.readValue(payloadJson, MyPojo.class);

если http://pojo.sodhanalibrary.com/ прекратит свое существование в будущем, просто поищите в Интернете "онлайн json to pojo", и вы, вероятно, что-то найдете.

Отличный! Я упростил эту работу, завершив ее в методе с собственным декодером пакета java.util.Base64, чтобы получить утверждение user_id из токена payoad:

Base64.Decoder base64Url = Base64.getUrlDecoder();

      public static String getUserIdFromToken(String token) throws IOException {
    //"------------ Decode JWT ------------");
    String[] split_string = token.split("\\.");
    String base64EncodedBody = split_string[1];
    Base64.Decoder base64Url = Base64.getUrlDecoder();
    Map<String, Object> mapping = new ObjectMapper().readValue(base64Url.decode(base64EncodedBody), HashMap.class);

    return mapping.get("user_id").toString();
}
Другие вопросы по тегам