Taro + node.js 注册 仿照java 中的加盐算法

1.需求

为了让用户的密码更加保密

我们在md5 之前 在加一个随机数 用java 的说法 叫做 加盐算法

2.代码

 //H5注册
  async H5Register(register) {
    if (
      !register.phone ||
      !register.password ||
      !register.confirmPassword ||
      !register.yzmCode ||
      !register.registerCode
    ) {
      throw new CoolCommException('参数不能为空~');
    }

    const phoneRegex = /^1[3-9]\d{9}$/; // 手机号码的正则表达式

    if (!phoneRegex.test(register.phone)) {
      throw new CoolCommException('手机号码格式不正确~');
    }
    if (register.password !== register.confirmPassword) {
      throw new CoolCommException('两次密码不一致');
    }
    const inviteCode = await this.businessUserEntity.findOneBy({
      inviteCode: register.registerCode,
    });
    if (!inviteCode) {
      throw new CoolCommException('导师不存在~');
    }
    const checkV = await this.captchaCheckByH5(register.yzmCode);
    if (checkV) {
      const user = await this.businessStudentEntity.findOneBy({
        phone: register?.phone,
      });
      if (user) {
        throw new CoolCommException('账户已存在~');
      }
      const salt = this.generatePasswordCode();
      await this.businessStudentEntity.save({
        phone: register.phone,
        password: md5(register.password + salt).toUpperCase(),
        membershipLevel: 0,
        balance: 0,
        userId: inviteCode.id,
        randomStr: salt,
      });
      return 1;
    } else {
      throw new CoolCommException('验证码不正确~');
    }
  }

 //生成加盐密码
  public generatePasswordCode() {
    // const hmac = crypto.createHmac('sha256', '1234567890');
    // hmac.update(password.toString());
    // const hash = hmac.digest('hex');
    // const code = hash.substring(0, 6).toUpperCase();
    // return code;

    let chars = 'ABCDEFGHJKMNPQRSTWXYZ1234567890';
    /****默认去掉了容易混淆的字符oOLl,9gq,Vv,Uu,I1****/
    let maxPos = chars.length;
    var code = '';
    for (let i = 0; i < 6; i++) {
      code += chars.charAt(Math.floor(Math.random() * maxPos));
    }
    return code.toString();
  }

3 登录验证

为了适配之前的纯md5 方式

  // H5 登录
  async H5Login(login) {
    if (!login.password || !login.phone) {
      throw new CoolCommException('账户或者密码不能为空~');
    }
    let user;
    // 尝试使用直接MD5加密的密码进行验证
    const userByDirectMd5 = await this.businessStudentEntity.findOneBy({
      phone: login.phone,
      password: md5(login.password),
    });

    // 如果没有找到,尝试使用带有随机字符串的加密方式
    if (!userByDirectMd5) {
      const userInfo = await this.businessStudentEntity.findOneBy({
        phone: login.phone,
      });

      if (!userInfo) {
        // 手机号不存在,直接返回错误
        throw new CoolCommException('账户不存在或密码不正确~');
      }

      const userByRandomStrMd5 = await this.businessStudentEntity.findOneBy({
        phone: login.phone,
        password: md5(login.password + userInfo.randomStr).toUpperCase(),
      });

      if (!userByRandomStrMd5) {
        // 密码不正确
        throw new CoolCommException('账户不存在或密码不正确~');
      }

      // 这里可以设置 user 为使用随机字符串加密方式找到的用户
      user = userByRandomStrMd5;
    } else {
      // 这里设置 user 为使用直接MD5加密方式找到的用户
      user = userByDirectMd5;
    }

    // 检查账户是否启用
    if (user.isEnabled == 0) {
      throw new CoolCommException('账户无权限,请联系客服开通~');
    }

    // 生成和缓存JWT令牌
    const { expire, refreshExpire } = this.coolConfig.jwt.token;
    const result = {
      expire,
      token: await this.generateTokenClient(user, expire),
      refreshExpire,
      refreshToken: await this.generateTokenClient(user, refreshExpire, true),
    };

    // 缓存令牌
    await this.cacheManager.set(
      `business:client:token:${user.id}`,
      result.token,
      { ttl: expire }
    );
    await this.cacheManager.set(
      `business:client:token:refresh:${user.id}`,
      result.refreshToken,
      { ttl: refreshExpire }
    );

    return result;
  }
相关推荐
熊的猫11 分钟前
webpack 核心模块 — loader & plugins
前端·javascript·chrome·webpack·前端框架·node.js·ecmascript
速盾cdn18 分钟前
速盾:vue的cdn是干嘛的?
服务器·前端·网络
四喜花露水1 小时前
Vue 自定义icon组件封装SVG图标
前端·javascript·vue.js
前端Hardy1 小时前
HTML&CSS: 实现可爱的冰墩墩
前端·javascript·css·html·css3
web Rookie1 小时前
JS类型检测大全:从零基础到高级应用
开发语言·前端·javascript
Au_ust2 小时前
css:基础
前端·css
帅帅哥的兜兜2 小时前
css基础:底部固定,导航栏浮动在顶部
前端·css·css3
工业甲酰苯胺2 小时前
C# 单例模式的多种实现
javascript·单例模式·c#
yi碗汤园2 小时前
【一文了解】C#基础-集合
开发语言·前端·unity·c#
就是个名称2 小时前
购物车-多元素组合动画css
前端·css