Подпись JWT не соответствует локально вычисленной подписи, хотя ключ, подписанный при создании и проверке токена, один иJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Подпись JWT не соответствует локально вычисленной подписи, хотя ключ, подписанный при создании и проверке токена, один и

Сообщение Anonymous »

Я гуглил эту проблему, но до сих пор не могу найти для себя ответа.
Я использую Spring Boot, и я генерирую ссылку, по которой пользователи могут получить доступ и изменить пароль. Ссылка, содержащая токен jwt, будет отправлена ​​на электронную почту пользователя.
Вот функция, которую я использую для этого

Код: Выделить всё

public ResponseEntity sendChangePasswordEmail(String email, boolean isInManagement) {
if(isExistEmail(email)) {
log.warn("Sent email to: " + email);
String token = jwtService.generateToken(email, 3600000); //generate token here
String link;
if(isInManagement) {
link = Constants.CONTEXT_PATH + "/management/changepassword?auth=" + token;
} else {
link = Constants.CONTEXT_PATH + "/changepassword?auth=" + token;
}
return emailService.sendToUser(EmailDetailsDto.builder().recipient(email).subject("Change password").messageBody(link).build())
? ResponseEntity.ok().build() : ResponseEntity.badRequest().build();
}
return ResponseEntity.badRequest().build();
}
Отправить электронное письмо пользователю (sendToUser):

Код: Выделить всё

@Autowired
private JavaMailSender javaMailSender;
public boolean sendToUser(EmailDetailsDto emailDetailsDto) {
try {
// Creating a simple mail message
SimpleMailMessage mailMessage = new SimpleMailMessage();

// Setting up necessary details
mailMessage.setFrom(sender);
mailMessage.setTo(emailDetailsDto.getRecipient());
mailMessage.setText(emailDetailsDto.getMessageBody());
mailMessage.setSubject(emailDetailsDto.getSubject());

// Sending the mail
javaMailSender.send(mailMessage);

return true;
} catch (Exception e) {
log.error("failed to send email: " + e);
return false;
}
}
Вот функция для генерации токена

Код: Выделить всё

public String generateToken(String subject, long expiration) {
Date now = new Date();
Date expiryDate = new Date(now.getTime() + expiration);
return Jwts.builder().setSubject(subject).setIssuedAt(now)
.setExpiration(expiryDate).signWith(SignatureAlgorithm.HS256, Constants.JWT_SECRET).compact();
}
После того, как пользователь получит электронное письмо, он нажмет на ссылку, и токен будет проверен этой функцией

Код: Выделить всё

public boolean validateToken(String token) {
try {
Jwts.parser().setSigningKey(Constants.JWT_SECRET).parseClaimsJws(token);
return true;
} catch (MalformedJwtException e) {
log.error("Invalid JWT token");
} catch (ExpiredJwtException e) {
log.error("Expired JWT token");
} catch (UnsupportedJwtException e) {
log.error("Unsupported JWT token");
} catch (IllegalArgumentException e) {
log.error("JWT token is empty");
}
return false;
}
Ошибка подписи JWT возникает в строке

Код: Выделить всё

Jwts.parser().setSigningKey(Constants.JWT_SECRET).parseClaimsJws(token);
Я читал, что разные SigningKeys при генерации и проверке приведут к этой ошибке, но в моем случае они одинаковы и являются Constants.JWT_SECRET . Время также указано в миллисекундах, но я все равно получаю эту ошибку. Кто-нибудь может объяснить, почему? И как это исправить?

Подробнее здесь: https://stackoverflow.com/questions/787 ... key-signed
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»