Почему мой код пропускает оператор try и go прямо к улову? - PullRequest
0 голосов
/ 30 января 2020

Я пытаюсь декодировать строку токена JWT, введенную пользователем, и проверяю подпись. Я использую библиотеку io.jsonwebtoken. Я получил «ключ» с помощью команды «openssl rand -base64 32» в моем терминале. В настоящее время я использую "http://jwtbuilder.jamiekurtz.com" для вычисления заголовка и полезной нагрузки. Затем я ввожу свой «ключ» в поле «Ключ» на веб-сайте jwtbuilder, как показано на рисунке по ссылке ниже:

jwtbuilder.com с требуемым заголовком, полезной нагрузкой и подписью

Это вывод при запуске кода:

Вывод кода

package com.okta.developer;

    import io.jsonwebtoken.*;
    import io.jsonwebtoken.security.Keys;

    import java.util.Base64;
    import java.util.Scanner;

    public class JWTexercise
    {
        public static void main(String [] args)
        {
            Scanner input = new Scanner(System.in);

            byte[] key = Base64.getDecoder().decode("b8SwFJZVgo+S5Cuhf5LWUeXpHxDm5mp30GCuQHX2TpY=");

            System.out.println("Enter your JWT token: ");
            String jwtString = input.nextLine();

            Jws<Claims> jws;

            try
            {
              // we can safely trust the JWT

                jws = Jwts.parser()         // (1)
                      .setSigningKey(Keys.hmacShaKeyFor(key))        // (2)
                      .parseClaimsJws(jwtString); // (3)

                System.out.println("The decoded JWT token id listed below:");
                System.out.println(jws);
                System.out.println();
                System.out.println("The signature is verified!");

            }
            catch (JwtException ex)
            {    
                System.out.println("Cannot trust JWT because the signature is not verified!");
                // we *cannot* use the JWT as intended by its creator
            }

        }


    }

1 Ответ

0 голосов
/ 30 января 2020

Я предполагаю, что ключ, который вы используете для создания токена, НЕ совпадает при проверке токена.

openssl rand -base64 32 должен создать случайный ключ, но это маловероятно эти символы для печати. Похоже, что http://jwtbuilder.jamiekurtz.com/ использует ключ, непосредственно введенный в текстовое поле, и НЕ base 64 декодирует его первым. Я никогда не использовал этот сайт, так что это всего лишь предположение.

По сути, это означает, что один из ключей:

byte[] key = Base64.getDecoder().decode("b8SwFJZVgo+S5Cuhf5LWUeXpHxDm5mp30GCuQHX2TpY=");

, а другой:

byte[] key = "b8SwFJZVgo+S5Cuhf5LWUeXpHxDm5mp30GCuQHX2TpY=".getBytes()

Первый вариант - лучшая практика, но я предполагаю, что когда вы заходите на этот сайт, вы захотите использовать второй вариант.

...