egg.js实现用户注册登录注销功能

用到的扩展

参数校验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, '注销成功')
  }

你可能感兴趣的:(javascript)