java - 为什么刷新访问令牌未经授权?
问题描述
随着访问令牌过期,客户端使用 /refresh 端点发送 GET 请求,但它以 401-unauthorized 结束。
我已经在 webConfig 中配置了这个请求。所以,它不需要授权。我已经在 /refresh 请求的标头中传递了访问令牌。
注意:如果我没有在 /refresh 请求的标头中传递令牌,它工作正常。
JwtAuthenticationController.java:
@RestController
public class JwtAuthenticationController {
@RequestMapping(value = "/refresh", method = RequestMethod.GET)
public ResponseEntity<?> refreshAuthenticationToken(HttpServletRequest request) {
final String token = request.getHeader("Authorization");
final String username = jwtUtils.getUsernameFromToken(token);
final UserDetails user = userDetailsService.loadUserByUsername(username);
if ((user.getUsername()).equals(username) && jwtUtils.isTokenExpired(token)) {
final String refreshedToken = jwtUtils.refreshToken(token);
return ResponseEntity.ok(new JwtAuthenticationResponse(refreshedToken));
}
else {
return ResponseEntity.badRequest().body(null);
}
}
}
WebSecurityConfig.java
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
httpSecurity.csrf().disable()
.exceptionHandling()
.antMatchers("/register","/refresh")
.permitAll()
.anyRequest().authenticated();
httpSecurity.addFilterBefore(authenticationTokenFilterBean(), UsernamePasswordAuthenticationFilter.class);
httpSecurity.headers().cacheControl().disable();
}
}
JwtAuthenticationFilter.java
@Component
public class JwtAuthenticationFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
throws ServletException, IOException {
String authToken = request.getHeader(AUTHORIZATION_HEADER);
if (authToken != null && authToken.startsWith(BEARER_PREFIX)) {
try {
authToken = authToken.substring(BEARER_PREFIX_LENGTH);
username = jwtUtils.getUsernameFromToken(authToken);
}catch (IllegalArgumentException e) {
System.out.println("Unable to get JWT Token");
} catch (ExpiredJwtException e) {
System.out.println("JWT Token has expired");
}
}
else {
logger.warn("JWT Token does not begin with Bearer String");
}
}
JwtUtils.java
private Claims getClaimsFromToken(String token) {
return Jwts.parser()
.setSigningKey(secret)
.requireIssuer(issuer)
.parseClaimsJws(token)
.getBody();
}
我无法找出为什么会这样?使用客户端发送的刷新令牌获取新访问令牌的解决方案是什么。
解决方案
如果我没有在 /refresh 请求的标头中传递令牌,它工作正常。
这可能是因为JwtAuthenticationFilter
. 我认为你也应该从检查中排除/refresh
,所以:
if (!request.getRequestURI().contains("/refresh") {
if (authToken != null && authToken.startsWith(BEARER_PREFIX)) {
//same logic
}
}
推荐阅读
- django - 打开模型项“编辑/更改”页面时如何自动修改 django 模型对象的值?
- r - r + hpc + git 问题:为参数列表提交具有不同值的多个作业
- google-chrome - requestFullscreen 在消息事件处理程序中不再起作用
- angular - 如何在 Ngrx 效果中组合多个可观察对象?
- spring - Spring Cloud 连接器计划信息
- firebase - Flutter Firebase Auth 返回 null,然后返回正确的值
- node.js - 错误:所需的气体超过限额或交易总是失败
- r - 重命名不适用于以两个点开头的列名
- database - Windows 批处理脚本中的 For /F 语句出错
- oracle - 更改项目属性可见或不可见的按钮