Как назначить токен jwt для генерации аутентификации на Java Spring - PullRequest
2 голосов
/ 30 апреля 2019

Как я могу декодировать токен и присвоить ему строку, соответствующую объекту?

Пример: логин пользователя с номером телефона, и он будет генерировать токен 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;
    }

Весь мой код генерирует и проверяет токен, как я тестировал, но при попытке сопоставить значения выдает эту ошибкукто-нибудь есть идеи?Я все еще нуждаюсь в весне на Яве.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...