eggjs实现用户注册登录注销功能

8次阅读

共计 2578 个字符,预计需要花费 7 分钟才能阅读完成。

用到的扩大

参数校验 egg-valparams

https://www.npmjs.com/package…

// 装置扩大
npm i egg-valparams --save

// 扩大开启 config/plugin.js
valparams : {
  enable : true,
  package: 'egg-valparams'
},
// 配置扩大 config/config.default.js
config.valparams = {
    locale    : 'zh-cn',
    throwError: false
};

数据加密 crypto

npm install crypto --save

// 配置扩大 config/config.default.js
config.crypto = {secret: 'Z#fOGf$te4^J28l1Z&$#fXCNifv!ZHQnEG'};

// 引入
const crypto = require('crypto');
// 加密
async createPassword(password) {const hmac = crypto.createHash("sha256", this.config.crypto.secret);
    hmac.update(password);
    return hmac.digest("hex");
}
// 验证明码
async checkPassword(password, hash_password) {
    // 先对须要验证的明码进行加密
    password = await this.createPassword(password);
    return password === hash_password;
}

jwt 加密鉴权

https://www.npmjs.com/package…

npm i egg-jwt --save

// {app_root}/config/plugin.js
exports.jwt = {
  enable: true,
  package: "egg-jwt"
};

// {app_root}/config/config.default.js
exports.jwt = {secret: 'qhdgw@45ncashdaksh2!#@3nxjdas*_672'};


// 生成 token
async getToken(arr) {return this.app.jwt.sign(arr, this.app.config.jwt.secret);
},
// 验证 token
async checkToken(token) {return this.app.jwt.verify(token, app.config.jwt.secret)
}

用户注册

  • 校验参数
  • 用户是否存在
  • 插入用户数据
  async register() {let { ctx, app} = this
    let {username,password,repassword} = this.ctx.request.body
    // 参数验证
    ctx.validate({username: {type: 'string',required: true, desc: '用户名', range: {min: 5,max: 10,}},
      password: {type: 'string',required: true,desc: "明码"},
      repassword: {type: 'string', required: true,desc: "确定明码"}
    }, {equals: [ ['password', 'repassword']]
    });

    console.log(ctx.paramErrors);
    // 校验失败返回
    if (ctx.paramErrors) {return ctx.error(ctx.paramErrors, '注册失败')
    }

    // 用户是否存在
    if (await app.model.User.findOne({where: {username}})) {return ctx.error('',' 用户曾经存在,毋庸注册 ')
    }
    // 插入用户数据
    let user = await app.model.User.create({username, password})
    if (!user) {return ctx.error('',' 创立用户失败 ')
    }
    return ctx.success(user, '注册胜利')
  }

登录

  • 参数校验
  • 验证用户是否存在
  • 验证明码是否存在
  • 生成 token
  • 保留 token 并返回
  async login() {let { ctx, app} = this
    let {username,password} = ctx.request.body
    // 参数验证
    ctx.validate({username: {type: 'string',required: true, desc: '用户名', range: {min: 5,max: 10,}},
      password: {type: 'string',required: true,desc: "明码"},
    });
    if (ctx.paramErrors) {return ctx.error(ctx.paramErrors, '参数校验不通过')
    }
    // 验证用户是否存在
    let userinfo = await app.model.User.findOne({where: {username}});

    if (!userinfo) {return ctx.error('',' 用户不存在 ')
    }
    // 校验明码是否正确
    if(userinfo.password != password){return ctx.error('',' 明码不正确 ')
    }

    let userinfoarr = JSON.parse(JSON.stringify(userinfo));
    // 生成 token
    let token =await ctx.getToken(userinfoarr);
    
    // 退出 session/cookie/ 缓存中
    ctx.session.userinfo = userinfoarr;
    ctx.session.token = token;

    // 返回用户信息和 token
    return ctx.success({token}, '登陆胜利')
  }

登记

也就是 session 清空

  async logout() {
    //  var userinfo=this.ctx.session
     this.ctx.session = null;
     return ctx.success(userinfo, '登记胜利')
  }
正文完
 0