我设计了一个 Web 应用程序,它使用非常简单的 JWT 令牌实现来提供身份验证/授权。
我的实施:
- 有两种类型的 url 的公共和安全。
- 公共 url 用于生成带有用户名/密码的令牌。
我在安全 url 上添加了过滤器以检查授权标头和 JWT 令牌。
@Bean public FilterRegistrationBean jwtFilter() { final FilterRegistrationBean registrationBean = new FilterRegistrationBean(); registrationBean.setFilter(new JwtFilter()); registrationBean.addUrlPatterns("/secure/*"); return registrationBean;
}
过滤器将验证令牌。我还没有添加到期日期。
final HttpServletRequest request = (HttpServletRequest) req; final HttpServletResponse response = (HttpServletResponse) res; final String authHeader = request.getHeader("authorization"); if ("OPTIONS".equals(request.getMethod())) { response.setStatus(HttpServletResponse.SC_OK); chain.doFilter(req, res); } else { if (authHeader == null || !authHeader.startsWith("Bearer ")) { throw new ServletException("Missing or invalid Authorization header"); } final String token = authHeader.substring(7); try { final Claims claims = Jwts.parser().setSigningKey(secretKey.toString).parseClaimsJws(token).getBody(); request.setAttribute("claims", claims); } catch (final SignatureException e) { throw new ServletException("Invalid token"); } chain.doFilter(req, res); }
这提供了身份验证,并且它不受 CSRF 的影响。没有密钥,没有人可以创建有效的令牌。
我错过了对基于令牌的身份验证服务的其他攻击吗?