2017-02-22 22 views
1

Я используюJWT подпись не соответствует локально вычисленной подписи

JwtBuilder builder = Jwts.builder() 
        .setId(user.getEmail()) 
        .signWith(signatureAlgorithm, signingKey); 

создать маркер затем

Jwts.parser().setSigningKey(secret).parse(token); 

для аутентификации. Когда я запускаю это в тесте JUnit, он работает нормально. Однако, когда я аутентифицирую токен, прошедший как заголовок по вызову REST, аутентификация завершается с помощью SignatureException. Я проверил токен на обоих концах HTTP-вызова, и строка токена идентична. Код для создания/аутентификации статичен, поэтому секрет с каждой стороны. Любые подсказки

+0

Не могли бы вы опубликовать пример токена и секретный ключ? – pedrofb

+0

static Key secret = MacProvider.generateKey(); SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256; byte [] apiKeySecretBytes = secret.getEncoded(); Key signatureKey = new SecretKeySpec (apiKeySecretBytes, signatureAlgorithm.getJcaName()); – stanlick

ответ

2

static Key secret = MacProvider.generateKey(); будет генерировать новый случайный ключ каждый раз, когда ваш сервер перезагрузке, потому что статические переменные инициализируются, когда класс загружается

Это означает, что если вы выдаете JWT, она действительна только до тех пор, как сервер не перезагружается. SignatureException вы получили потому, что ключ подписи он отличается

Вы должны хранить ключ подписи secret.getEncoded() после первого поколения и загрузить его, когда ваш модуль начинает

+0

Большое наблюдение. Тем не менее, у меня есть один класс утилиты на сервере, который является единственной ссылкой на этот статический ключ. Он использует эту единственную ссылку для операций создания и аутентификации. Вот почему это так запутанно. – stanlick

+0

Просто убедитесь, что нет другой скрытой проблемы: вы могли распечатать ключевой контент перед подписанием и проверкой? Например, 'System.out.println (DatatypeConverter.printHexBinary (secret.getEncoded()))' – pedrofb

+0

@stanlick, вы проверяли, был ли секретный код одинаковым при подписании и проверке? – pedrofb

Смежные вопросы