java - 如何从 JWT 获取用户名?

标签 java spring-boot jwt

我有 2 个微服务。向客户发送消息的 API 网关和微服务。 我的 API 在身份验证后返回 JWT token 。用户的用户名包含在 token 中。

        public String extractUsername(String token)
        {
            return extractClaim(token, Claims::getSubject);
        }
        public Date extractExpiration(String token)
        {
            return extractClaim(token, Claims::getExpiration);
        }
        public <T> T extractClaim(String token, Function<Claims,T> claimsResolver)
        {
            final Claims claims = extractAllClaims(token);
            return claimsResolver.apply(claims);
        }
        private Claims extractAllClaims(String token)
        {
            return Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody();
        }
        private Boolean isTokenExpired(String token)
        {
            return extractExpiration(token).before(new Date());
        }
        public String generateToken(UserDetails userDetails)
        {
            Map<String,Object> claims =new HashMap<>();
            return createToken(claims,userDetails.getUsername());
        }
        private String createToken(Map<String, Object> claims, String subject)
        {
            return Jwts.builder().setClaims(claims).setSubject(subject).setIssuedAt(new Date(System.currentTimeMillis()))
                    .setExpiration(new Date(System.currentTimeMillis() + 1000*60*60*24*360))
                    .signWith(SignatureAlgorithm.HS256, SECRET_KEY).compact();
        }
        public Boolean validateToken(String token, UserDetails userDetails)
        {
            final String username = extractUsername(token);
            return (username.equals(userDetails.getUsername()) && !isTokenExpired(token));
        }

如果我想通过API网关访问我的SendMessage微服务,他需要用户名来发送消息。我目前正在通过 Rest-Api 传递用户名。我希望 SendMessage 微服务从 token 中获取用户名。我读过这适用于 TokenEnhancer。但我没有找到进一步的信息。谁能告诉我如何执行此操作或在哪里可以找到更多信息?

更新

@GetMapping("/contacts/sms/{name}/{customer_phone_number}/{text}")
            public String sendSmsToCustomer(@PathVariable("name") String name,@PathVariable("customer_phone_number") String customer_phone_number, @PathVariable("text") String text) throws Exception
            {
            
String user= getUsernameFromToken(HttpServletRequest request);
            
            
            SmsSubmissionResponse responses = client.getSmsClient().submitMessage(new TextMessage(
                    name,
                    customer_phone_number,
                    text));
            for (SmsSubmissionResponseMessage response : responses.getMessages()) {
                System.out.println (response);
            }
        
            if (responses.getMessages().get(0).getStatus() == MessageStatus.OK) {
                String date=new SimpleDateFormat("yyyy.MM.dd - HH:mm:ss").format(new java.util.Date());
                    SQL_Connection.SaveDataInSmsDB(name, customer_phone_number, text,date);
                    return "Message sent successfully.";
                } else {
                    return "Message failed with error: " + responses.getMessages().get(0).getErrorText();
                }
            }

更新 2

@GetMapping("/contacts/sms/{name}/{customer_phone_number}/{text}")
            public String sendSmsToCustomer(@RequestHeader(HEADER_STRING) HttpServletRequest request, @PathVariable("name") String name,@PathVariable("customer_phone_number") String customer_phone_number, @PathVariable("text") String text) throws Exception
            {
            String user= getUsernameFromToken(request);
            System.out.println(user);
{
    "timestamp": "2020-07-07T08:08:34.975+0000",
    "status": 400,
    "error": "Bad Request",
    "message": "Missing request header 'Authorization' for method parameter of type HttpServletRequest",
    "path": "/contacts/sms/segos/44256674/hallo%20Container%20kommt"
}

最佳答案

您可以使用以下代码从 token 中提取用户

 String token = request.getHeader(HEADER_STRING);
    String user = null;
    if (token != null) {
        // parse the token.

        try {
            user = Jwts.parser()
                    .setSigningKey(SECRET)
                    .parseClaimsJws(token.replace(TOKEN_PREFIX, ""))
                    .getBody()
                    .getSubject();


        } catch (Exception e) {

            throw e;

        }

你可以引用完整的代码和项目

https://github.com/techiesantosh/taskmanager-service/blob/develop/src/main/java/com/web/taskmanager/auth/TokenAuthenticationService.java

关于java - 如何从 JWT 获取用户名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62756533/

相关文章:

java - getter 方法和返回实例变量状态的方法之间的区别?

GAE 上的 Spring Boot Rest App 抛出异常无法转换为 javax.persistence.EntityManagerFactory”

java - 如何在 Spring Boot 2 中保护具有角色的执行器端点?

spring-boot - 为什么Spring-data-redis在缓存驱逐时使用keys命令

java - 尝试将 native SQL 转换为 HQL 时出现异常?

java - 比较 Long 值 Struts2

java - Scala 集合 : util. Map[String, AnyRef] - Map[String, String]

javascript - 如何在整个 session 期间保留 JWT token 直到用户注销?

google-cloud-platform - 为 Google 服务帐户生成签名 JWT - 验证失败

angular - 在基于 session 的 cookie Angular 6 中存储 JWT