【无标题】

jwt token的payload主要内容

复制代码
  "token": {
    "trigger": "signIn",
    "iat": 1716279911,
    "exp": 1724055911,
    "jti": "f8f683ce-08a2-44b1-b109-139fb297959d"
  }

其中iat 是当前令牌分发时间,每次登录重新生成令牌,刷新该值.所以具体思路是,重置密码的时候记录下当前重置时间

复制代码
      const user = await prisma.user.update({
        where: {
          email: input.email,
        },
        data: {
          password: getSHA256ofJSON(input.newPassword),
        },
      })

 
      await prisma.userResetToken.update({
        where: { identifier: input.email },
        data: { resetTime: new Date() },
      })

然后在next-auth jwt回调中进行判断

复制代码
         if (token.email && token.exp && token.iat) {
            const userResetToken = await prisma.userResetToken.findFirst({
              where: { identifier: token.email },
            })

            if (userResetToken && userResetToken.resetTime) {
              const resetTime = userResetToken.resetTime

              console.log('重置token exp')

              // token.exp = '1716107284'   //想设置下token的exp 为一个过期时间,但是并没有更新到客户端
            
            // 如果jwt 创建时间少于重置密码最新时间,说明jwt过期了
              if (
                resetTime && (token.iat as number) < resetTime.getTime()
              ) {
                console.log('jwt过期 重新登录')
                return null
              }
            }
          }

原本想设置token 过期并可以更新到客户端.重写jwt 的decode

复制代码
      async decode(params: JWTDecodeParams) {
          const result = (await decode({
            token: params.token,
            secret: params.secret ??process.env.NEXTAUTH_SECRET ,
          })) as any
      
          return result
        },

重写jwt 的encode

复制代码
        async encode(params: JWTEncodeParams) {
        const { token, secret } = params

        // 创建时间小于当前账户的重置密码时间,让token 过期
        if (token && token.email && token.exp) {
          const userResetToken = await prisma.userResetToken.findFirst({
            where: { identifier: token.email },
          })
          if (userResetToken) {
            const resetTime = userResetToken.resetTime

            // 如果jwt 创建时间少于重置密码最新时间,说明jwt过期了
            if (resetTime && (token.iat as any) < resetTime.getTime() ) {
              // token.email = "[email protected]"
              token.exp = Date.now()
            }
          }
        }

        const encodedToken = encode(params,secret)
        return encodedToken
      },

测试流程。

浏览器A登录 浏览器B登录,浏览器A重置密码,查看浏览器B请求,登录状态已经无效

其他方案:

1 .黑名单校验

记录用户登录的每一个token

修改密码后让之前的token 全部列入黑名单

每次用户请求服务器都校验token是否在黑名单

问题:(还不清楚在next-auth 中怎么实现,我们现在没有手动记录token)

  1. 版本号校验

记录用户登录的每一个token,设置一个版本号

修改密码同时修改用户token版本号(加1==)

访问时从token中取出版本号和用户id 进行对比,不一致就不通过

问题:(还不清楚在next-auth 中怎么实现,我们现在没有手动记录token)

无为而治

只让前端清理token,后端不理会。(大多数)

相关推荐
还是鼠鼠1 小时前
Node.js自定义中间件
javascript·vscode·中间件·node.js·json·express
大莲芒4 小时前
react 15-16-17-18各版本的核心区别、底层原理及演进逻辑的深度解析--react17
前端·react.js·前端框架
xy_optics4 小时前
用matlab探索卷积神经网络(Convolutional Neural Networks)-3
开发语言·matlab·cnn
独好紫罗兰4 小时前
洛谷题单3-P1720 月落乌啼算钱(斐波那契数列)-python-流程图重构
开发语言·算法·leetcode
木木黄木木6 小时前
html5炫酷3D文字效果项目开发实践
前端·3d·html5
慕容莞青6 小时前
MATLAB语言的进程管理
开发语言·后端·golang
jimin_callon6 小时前
VBA第三十八期 VBA自贡分把表格图表生成PPT
开发语言·python·powerpoint·编程·vba·deepseek
Li_Ning216 小时前
【接口重复请求】axios通过AbortController解决页面切换过快,接口重复请求问题
前端
胡八一7 小时前
Window调试 ios 的 Safari 浏览器
前端·ios·safari
Dontla7 小时前
前端页面鼠标移动监控(鼠标运动、鼠标监控)鼠标节流处理、throttle、限制触发频率(setTimeout、clearInterval)
前端·javascript