我有两个微服务。一个是API网关,另一个是向客户发送消息的微服务。我的API在身份验证后返回一个JWT令牌。用户的用户名包含在令牌中。
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微服务从令牌中获取用户名。我读到过这与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
一个二个一个一个
5条答案
按热度按时间sg2wtvxw1#
您可以使用以下代码从令牌中提取用户
你可以参考完整的代码和项目
https://github.com/techiesantosh/taskmanager-service/blob/develop/src/main/java/com/web/taskmanager/auth/TokenAuthenticationService.java
h43kikqp2#
使用以下命令从jwt标记解析用户名
niknxzdl3#
通过
authentication.getName
&principal.getName
您可以获得用户名:尝试以下代码:
sczxawaw4#
验证后,您可以通过覆盖
successfulAuthentication()
方法发送JWT令牌生成令牌代码:
SecurityConfig.java
获取请求后,将使用
http.anyRequest().authenticated()
方法进行身份验证,然后调用下面的授权过滤器对请求进行身份验证。AuthorizationFilter.java
我希望此代码对您有用
bq3bfh9z5#
你好,新版本的spring Boot 3和jjwt版本0.11.5,这对我来说很好:
final var subject = Jwts.parserBuilder().setSigningKey(Keys.hmacShaKeyFor(Decoders.BASE64.decode(jwtSecret))).build().parseClaimsJws(token).getBody().getSubject();