【无标题】

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 = "test@123.com"
              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,后端不理会。(大多数)

相关推荐
南极星100517 分钟前
蓝桥杯JAVA--启蒙之路(十)class版本 模块
java·开发语言
未来之窗软件服务20 分钟前
未来之窗昭和仙君(六十五)Vue与跨地区多部门开发—东方仙盟练气
前端·javascript·vue.js·仙盟创梦ide·东方仙盟·昭和仙君
baidu_2474386121 分钟前
Android ViewModel定时任务
android·开发语言·javascript
嘿起屁儿整33 分钟前
面试点(网络层面)
前端·网络
Dev7z33 分钟前
基于 MATLAB 的铣削切削力建模与仿真
开发语言·matlab
不能隔夜的咖喱39 分钟前
牛客网刷题(2)
java·开发语言·算法
VT.馒头40 分钟前
【力扣】2721. 并行执行异步函数
前端·javascript·算法·leetcode·typescript
小天源1 小时前
Error 1053 Error 1067 服务“启动后立即停止” Java / Python 程序无法后台运行 windows nssm注册器下载与报错处理
开发语言·windows·python·nssm·error 1053·error 1067
有位神秘人1 小时前
Android中Notification的使用详解
android·java·javascript
肉包_5111 小时前
两个数据库互锁,用全局变量互锁会偶发软件卡死
开发语言·数据库·c++