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;
  }
相关推荐
莹雨潇潇6 分钟前
Docker 快速入门(Ubuntu版)
java·前端·docker·容器
Jiaberrr15 分钟前
Element UI教程:如何将Radio单选框的圆框改为方框
前端·javascript·vue.js·ui·elementui
Tiffany_Ho1 小时前
【TypeScript】知识点梳理(三)
前端·typescript
安冬的码畜日常2 小时前
【D3.js in Action 3 精译_029】3.5 给 D3 条形图加注图表标签(上)
开发语言·前端·javascript·信息可视化·数据可视化·d3.js
太阳花ˉ2 小时前
html+css+js实现step进度条效果
javascript·css·html
小白学习日记3 小时前
【复习】HTML常用标签<table>
前端·html
程序员大金3 小时前
基于SpringBoot+Vue+MySQL的装修公司管理系统
vue.js·spring boot·mysql
john_hjy3 小时前
11. 异步编程
运维·服务器·javascript
风清扬_jd3 小时前
Chromium 中JavaScript Fetch API接口c++代码实现(二)
javascript·c++·chrome