java小菜一枚 2023-11-09 15:31 采纳率: 87.2%
浏览 52
已结题

jwt生成的token为什么会一样,但是我去使用的时候token又报过期的错误

为什么jwt生成的token会是完全一样的?

jwt生成的token为什么会一样,登录的是同一个账号,但是我去使用的时候token又报过期的错误?我设置了过期时间

 public String createToken(Integer id,String username,Integer gradeId,Integer jurisdictionId,Integer status) {
        JWTCreator.Builder builder = JWT.create();
        builder.withClaim("id",id);
        builder.withClaim("username",username);
        builder.withClaim("gradeId",gradeId);
        builder.withClaim("jurisdictionId",jurisdictionId);
        builder.withClaim("status",status);
        long expiration = StatusCode.tokenExpiration.getCode() * 60 * 60 * 1000;
        builder.withExpiresAt(new Date(expiration));
        String token = builder.sign(Algorithm.HMAC256(SIGNATURE));
        Map<String,Object> verifyTokenMap = new HashMap<>();
        verifyTokenMap.put("userId",id);
        verifyTokenMap.put("token",token);
        this.verifyToken.add(verifyTokenMap);
        this.redisUtil.setValue("token" + id,token);
        return token;
    }
  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-11-09 18:17
    关注

    【以下回答由 GPT 生成】

    问题分析:

    根据提供的代码,我们可以看到在生成token的过程中,使用了JWT库创建了一个builder对象,并为其添加了一系列的声明(Claims),包括id、username、gradeId、jurisdictionId和status。然后设置了token的过期时间,并使用HMAC256算法将builder对象签名为token。

    根据代码来看,每次生成的token应该是不一样的,但问题描述中却说生成的token每次都完全一样。

    这个问题有可能有以下几个原因:

    1. 生成的token存储在了固定的位置,每次生成时并没有覆盖之前的token,导致每次生成的token都是相同的。

    2. 签名使用的SECRET(SIGNATURE)每次都是相同的,导致生成的token也是相同的。

    解决方案:

    1. 确保每次生成的token存储在不同的位置,可以使用不同的存储key来保存每次生成的token。可以修改代码中这一行 this.redisUtil.setValue("token" + id, token);,使用不同的key来保存每次生成的token,示例代码如下:
    String key = "token" + id + "_" + System.currentTimeMillis();
    this.redisUtil.setValue(key, token);
    
    1. 确保每次生成的token都使用不同的SECRET(SIGNATURE)进行签名。可以尝试生成一个随机的SECRET并使用该SECRET进行签名,示例代码如下:
    String SECRET = generateRandomSecret();
    String token = builder.sign(Algorithm.HMAC256(SECRET));
    
    // 随机生成SECRET的方法示例
    private String generateRandomSecret() {
        // 在这里生成一个随机的SECRET
        // 可以使用UUID等随机数生成方法
        return "xxxxx";
    }
    

    请注意,以上代码仅为示例代码,需要根据实际情况进行调整。

    如果以上两种方法都没有解决问题,那么可能是你的代码中其他地方导致了生成的token一样。

    希望以上解决方案对你有帮助。如果问题还未解决,请提供更多的代码和详细信息以便我们进一步分析。



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 11月18日
  • 已采纳回答 11月10日
  • 创建了问题 11月9日

悬赏问题

  • ¥15 python 打包sdk不成功,如何解决?
  • ¥15 adv找不到可向其添加属性的有效项目。
  • ¥15 cesm2.2.0移植问题。./manage_externals/checkout_externals
  • ¥15 ntp对时中的时标问题
  • ¥35 pcb上电后,不一会儿,主控过热烧毁
  • ¥15 ubuntu,windows,文件传输,Linux
  • ¥15 北斗定位,cors,无人机,图传
  • ¥15 Unity热更新框架问题
  • ¥20 如何提交icra的附录.应该在哪里提交
  • ¥20 请教yolov8出现如下bug怎么办