Заголовок: Невозможно проанализировать JWT с помощью пользовательских утверждений с помощью jjwt-jackson 0.12.6Тело:
Я работаю с библиотекой jjwt (версия 0.12.6) для создания и анализа токенов JWT. которые включают в себя пользовательские претензии. Пользовательские утверждения включают полномочия пользователя, и для анализа я использую расширение Jackson. Однако когда я пытаюсь проанализировать токен JWT, я сталкиваюсь с проблемами, и утверждения анализируются неправильно.
Вот код, с которым я работаю:
Код: Выделить всё
import com.damal.backend.account.entity.Account;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.io.Decoders;
import io.jsonwebtoken.security.Keys;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Service;
import javax.crypto.SecretKey;
import java.time.Duration;
import java.util.Date;
import java.util.Map;
import java.util.Optional;
import java.util.function.Function;
@Service
public class JwtService {
private static final String AUTHORITIES = "authorities";
private static final String JWT_SECRET_KEY_PROPERTY = "${application.security.jwt.secret-key}";
@Value(JWT_SECRET_KEY_PROPERTY)
private String secretKey;
public Optional extractUsernameFromToken(String token) {
return extractClaimFromToken(token, Claims::getSubject);
}
public Optional extractClaimFromToken(String token, Function claimsResolver) {
final Claims claims = extractAllClaimsFromToken(token);
return Optional.ofNullable(claimsResolver.apply(claims));
}
public String generateTokenWithClaims(Map extraClaims, Account user, Duration expirationDuration) {
return Jwts.builder()
.claims(extraClaims)
.subject(user.getUsername())
.issuedAt(new Date(System.currentTimeMillis()))
.expiration(new Date(System.currentTimeMillis() + expirationDuration.toMillis()))
.claim(AUTHORITIES, user.getAuthorities().stream()
.map(GrantedAuthority::getAuthority)
.toList())
.signWith(getDecodedSigningKey())
.compact();
}
public boolean isTokenValidForUser(String token, UserDetails userDetails) {
final Optional username = extractUsernameFromToken(token);
return username.isPresent()
&& username.get().equals(userDetails.getUsername())
&& !isTokenExpired(token);
}
public boolean isTokenExpired(String token) {
Date expiration = extractExpirationDateFromToken(token).orElse(new Date());
return expiration.before(new Date());
}
private Optional extractExpirationDateFromToken(String token) {
return extractClaimFromToken(token, Claims::getExpiration);
}
private Claims extractAllClaimsFromToken(String token) {
return Jwts.parser()
.verifyWith(getDecodedSigningKey())
.build()
.parseSignedClaims(token)
.getPayload();
}
private SecretKey getDecodedSigningKey() {
byte[] keyBytes = Decoders.BASE64.decode(secretKey);
return Keys.hmacShaKeyFor(keyBytes);
}
}
- Я генерирую токен с настраиваемым утверждением (авторитетами) и секретным ключом, но когда Я пытаюсь проанализировать токен, но он не может правильно проанализировать утверждения.
- Я использую расширение Джексона () для обработки синтаксического анализа JWT, и проблема, по-видимому, связана с анализом пользовательских утверждений.
Код: Выделить всё
jjwt-jackson
- Я обновил метод extractAllClaimsFromToken для анализа JWT с помощью Jwts.parser() и secretKey, но я получаю ошибки синтаксического анализа.
- Я проверил, что secretKey правильно закодирован и декодирован в Base64.
- Я использую Spring Security для аутентификации пользователей, а утверждение полномочий содержит список ролей.
- Я хочу получить пользовательские утверждения (например, полномочия) из JWT после анализа.
Подробнее здесь: https://stackoverflow.com/questions/792 ... tom-claims