Как я могу декодировать токен и присвоить ему строку, соответствующую объекту?
Пример: логин пользователя с номером телефона, и он будет генерировать токен jwt при декодировании, это будет:
{
"sub": "+440000010010" //can be any phone number
}
Затем мне нужно получить этот номер телефона и сравнить его с полем phoneNumber, после чего он сгенерирует действительный идентификатор.
Ошибка моего кода отображается как несовместимые типы java.lang.string
Myдескриптор токена генерирует и проверяет токен
public String generate(String username) {
Claims claims = Jwts.claims().setSubject(username);
Date now = new Date();
Date expiryDate = new Date(now.getTime() + jwtExpirationInMs);
return Jwts.builder()
.setIssuedAt(new Date())
.setExpiration(expiryDate)
.setClaims(claims)
.signWith(SignatureAlgorithm.HS512, jwtSecret)
.compact();
}
public JwtUserDetails validate (String token) {
JwtUserDetails jwtUserDetails = null;
try {
Claims body = Jwts.parser().setSigningKey(jwtSecret).parseClaimsJws(token).getBody();
jwtUserDetails = new JwtUserDetails(body.getSubject(), token);
} catch (Exception e) {
e.printStackTrace();
}
return jwtUserDetails;
}
public boolean validateToken(String token) {
try {
Jwts.parser().setSigningKey(jwtSecret).parseClaimsJws(token);
return true;
} catch (SignatureException ex) {
logger.error("Invalid JWT signature");
} catch (MalformedJwtException ex) {
logger.error("Invalid JWT token");
} catch (ExpiredJwtException ex) {
logger.error("Expired JWT token");
} catch (UnsupportedJwtException ex) {
logger.error("Unsupported JWT token");
} catch (IllegalArgumentException ex) {
logger.error("JWT claims string is empty.");
}
return false;
}
мой фильтр
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
try {
String jwt = getJwtFromRequest(request);
if (StringUtils.hasText(jwt) && jwtTokenHandler.validateToken(jwt)) {
String phoneNumber = jwtTokenHandler.validate(jwt) ;
UserDetails userDetails = customUserDetailsService.loadUserPhone(username);
UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
SecurityContextHolder.getContext().setAuthentication(authentication);
}
} catch (Exception ex) {
logger.error("Could not set user authentication in security context", ex);
}
filterChain.doFilter(request, response);
}
private String getJwtFromRequest(HttpServletRequest request) {
String bearerToken = request.getHeader("Authorization");
if (StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")) {
return bearerToken.substring(7, bearerToken.length());
}
return null;
}
Весь мой код генерирует и проверяет токен, как я тестировал, но при попытке сопоставить значения выдает эту ошибкукто-нибудь есть идеи?Я все еще нуждаюсь в весне на Яве.