Node.js之注册登录 bcrypt密码加密 jwt生成token

注册部分

1.安装bcrypt 给密码加密
github bcrypt
文件目录结构
2.utils内新建utils.js

const bcrypt = require('bcrypt')
// 加密
exports.hash = (plaintextPassword) => {
  const saltRounds = 10
  return new Promise(resolve => {
    bcrypt.genSalt(saltRounds, function(err, salt) {
      bcrypt.hash(plaintextPassword, salt, function(err, hash) {
        resolve(hash)
      })
    })
  })
}
// 对比
exports.compare = (myPlaintextPassword, hash) => {
  return new Promise(resolve => {
    bcrypt.compare(myPlaintextPassword, hash, function(err, result) {
      resolve(result)
    })
  })
}

登录部分

1.安装openssl 生成公钥和私钥
github openssl

// 生成私钥
genrsa -out rsa_private_key.pem 2048
// 根据私钥生成公钥
rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

之后放到keys文件夹内备用

2.安装jwt
github jsonwebtoken
utils内新建token.js 内容如下

const fs = require('fs')
const path = require('path')
const jwt = require('jsonwebtoken')

// 生成token方法
exports.sign = (payload) => {
  var privateKey = fs.readFileSync(path.resolve(__dirname, '../keys/rsa_private_key.pem'));
  var token = jwt.sign(payload, privateKey, { algorithm: 'RS256'});
  return token
}

// 验证token方法
exports.verify = (token) => {
  var cert = fs.readFileSync(path.resolve(__dirname, '../keys/rsa_public_key.pem'));  // get public key
  return new Promise(resolve => {
    jwt.verify(token, cert, function(err, decoded) {
      resolve(decoded)
    })
  })
}

配置好路由后 controller层内新建users.js

const userModel = require('../model/user')
const { hash, compare } = require('../utils/bcrypt')
const { sign } = require('../utils/token')

// 注册
const signup = async (ctx, next) => {
  ctx.res.writeHead(200, {
    'Content-Type': 'application/json; charset=utf-8'
  })
	// koa-bodyparser解析请求参数
  let { username, password } = ctx.request.body
	// 查找用户名是否已注册
  let user = await userModel.findOne(username)
	// 如果没有
  if (!user) {
    // bcrypt 加密
    let newPassword = await hash(password)
    // 入库
    let result = await userModel.signup({username, password: newPassword})
  
    if (result) {
      ctx.render('success.art', {
        data: JSON.stringify({
          username: result.username
        })
      })
    } else {
      ctx.render('fail.art', {
        message: JSON.stringify('注册失败。')
      })
    }
    await next()
  } else {
    ctx.render('fail.art', {
      message: JSON.stringify('用户名存在')
    })
  }

}

// 登录
const signin = async (ctx, next) => {
  ctx.res.writeHead(200, {
    'Content-Type': 'application/json; charset=utf-8'
  })
  let { username, password } = ctx.request.body
  let result = await userModel.findOne(username)
	// 根据用户名生成token
  let token = sign({username})
	
  if (result) {
    // 对比两次密码
    let ret = await compare(password, result.password)
    if (ret) {
      // koa 如何设置自定义首部?
      ctx.res.writeHead( 200, {
        'X-Access-Token': token
      })
      ctx.render('success.art', {
        data: JSON.stringify({
          username: result.username
        })
      })
    } else {
      ctx.render('fail.art', {
        message: JSON.stringify('登录失败。')
      })
    }
  } else {
    ctx.render('fail.art', {
      message: JSON.stringify('登录失败。')
    })
  }
}

// 退出


module.exports = {
  signup,
  signin,
  signout
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值