JWT token无效invalid signature

django+ JWT 生成发token无效

请求需要验证的接口,返回

invalid signature

 

我的user模型是这样的

 

 

后面看https://www.jianshu.com/p/f0a55f39dfa8链接说,jwt生成token时默认是需要用到username,并且username需要保证唯一,或者重写UserManager的get_by_natural_key方法

所以解决方法有两个:

方法1.username需要修改为唯一约束,修改迁移后只对后续用户有效,以前同username的token还是会无效,修改username也还是会无效

 

方法2.

重写UserManager的get_by_natural_key方法,查询的必须是唯一值

 

### JWT Token验证方法 #### 创建Token工具类 为了方便操作JWT,在项目中通常会创建一个专门处理JWT的工具类。此类负责生成和解析Token,确保其有效性和安全性。 ```java import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; public class JwtUtil { private static final String SECRET_KEY = "yourSecretKey"; // 密钥应妥善保管并配置到更安全的地方 public String generateToken(String username){ return Jwts.builder() .setSubject(username) .signWith(SignatureAlgorithm.HS256,SECRET_KEY.getBytes()) .compact(); } public Claims parseToken(String token){ return Jwts.parser() .setSigningKey(SECRET_KEY.getBytes()) .parseClaimsJws(token.replace("Bearer ","")) .getBody(); } } ``` 此代码展示了如何构建以及解码带有签名算法HS256的JSON Web Tokens[^1]。 #### 创建拦截器 为了让应用程序能够自动检查请求中的Token有效性,可以编写自定义过滤器来截获HTTP请求,并从中提取出Authorization头内的Bearer Token进行校验。 ```java @Component public class JwtRequestFilter extends OncePerRequestFilter { @Autowired private JwtUtil jwtUtil; @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException { final String authorizationHeader = request.getHeader("Authorization"); String username = null; String jwt = null; if (authorizationHeader != null && authorizationHeader.startsWith("Bearer ")) { jwt = authorizationHeader.substring(7); try{ username = jwtUtil.parseToken(jwt).getSubject(); }catch(Exception e){ logger.error("Invalid JWT token",e); throw new ServletException("Unauthorized"); } } if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) { UserDetails userDetails = this.jwtUserDetailsService.loadUserByUsername(username); if (jwtUtil.validateToken(jwt,userDetails)) { UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails,null,userDetails.getAuthorities()); authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); SecurityContextHolder.getContext().setAuthentication(authentication); } } chain.doFilter(request,response); } } ``` 这段Java代码实现了对传入HTTP请求携带的身份令牌的有效性检测机制。 通过上述方式,当客户端发送包含合法授权凭证(即有效的JWT)至服务器时,则允许访问受保护资源;反之则拒绝未认证用户的非法访问尝试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值