Строка Base64 от JWT до JSON - PullRequest
1 голос
/ 13 марта 2019

Когда я пытаюсь проанализировать заголовок из jwt как base64 в строку, вывод будет:

{"alg": "RS256", "typ": "JWT", "kid":«1234»

без последней скобки, но когда я декодирую ту же строку base64, например, здесь: https://www.base64decode.org/, тогда json имеет правильный формат.

функция, которую яиспользуйте:

   public void test() {
            String encodedToken = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjEyMzQifQ";
            System.out.println(new String(DatatypeConverter.parseBase64Binary(encodedToken)));
        }

Что может быть не так?

РЕДАКТИРОВАТЬ: Java 7 является обязательным.

Ответы [ 2 ]

2 голосов
/ 13 марта 2019

Попробуйте кодировать {"alg":"RS256","typ":"JWT","kid":"1234"} в base64

Вы увидите eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjEyMzQifQ==

== - это отступ

Я думаю, что проблема заключается в DatatypeConverter.parseBase64Binary использование представления xsd: base64Binary (RFC 2045). Но в RFC 2045 заполнение является обязательным.

Вы можете использовать этот способ (java.util.Base64):

public void test() {
    String encodedToken = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjEyMzQifQ";
    System.out.println(new String(Base64.getDecoder().decode(encodedToken.getBytes())));
}

java.util.Base64 использует RFC 4648 (заполнение необязательно).

0 голосов
/ 13 марта 2019

и добро пожаловать на StackOverflow. Согласно этому ответу на Github, DatatypeConverter.parseBase64Binary() имеет некоторые ошибки и не выводит правильную декодированную строку.

Если вы используете Java 8 или выше, вы можете декодировать это так:

String base64 = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjEyMzQifQ";
byte[] temp = Base64.getDecoder().decode(base64.getBytes());

System.out.println(new String(temp));

класс импорта java.util.Base64

...