Koa2用户注册生成密文密码及用户登录时生成token返回

项目开发时免不了用户注册和登录的模块,用户生成密文密码保存,及用户登录时密文密码的校验还有token的生成及校验都是很重要的,这篇文章教大家在Koa2开发项目的这块教程!

一、用户注册时密文密码生成及校验

  1. 在需要加密的模块安装并引入bcrypt

bcrypt是通过hash模式生成密文的模块,且相同密码每次生成的hash密文也不一样,这就比以前MD5的加密模式安全多了,别人基本不可能解密这个hash密文。

npm install bcrypt --save
const bcrypt = require('bcrypt')

2.在需要加密的地方使用bcrypt生成hash

const hashPassword = bcrypt.hashSync(password, 10)

3.把这个加密的hash密码存到数据库

const res = await userModel.create({username, hashPassword})

4.在用户登录时先验证用户名是否存在,存在的话验证这个hash密码是否正确

const confirmRes = bcrypt.compareSync(password, user.password)

password是用户登录时传的密码,user.password是数据库保存的hash密码,验证后返回confirmRes是一个布尔值,相等为true,不相等为false。

二、生成token返回前端,并在其他接口调用时验证

1.安装需要的相关模块

npm install jsonwebtoken koa-passport passport-jwt --save

jsonwebtoken是用来生成token,koa-passport是用来做用户权限认证的(如其他接口调用时验证token),passport-jwt专门用来解密验证token(依赖于koa-passport)

2.在app.js中初始化koa-passport

const passport = require('koa-passport')
app.use(passport.initialize())
app.use(passport.session())
require('./config/passport')(passport)

前面三行是引入并初始化,最后一行是koa-passport的配置文件,我单独写到config/passport.js文件里面

3.config/passport.js的配置

module.exports = passport => {
  const secretOrKey = 'secret' // 生成token的钥匙,解密时也需要
  const {userModel} = require('../models/user')  // 引入用户模型来验证token
  const JwtStrategy = require('passport-jwt').Strategy,
    ExtractJwt = require('passport-jwt').ExtractJwt;
  const opts = {}
  opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken();
  opts.secretOrKey = secretOrKey;
  passport.use(new JwtStrategy(opts, async function(jwt_payload, done) {
    const user = await userModel.findById(jwt_payload._id) // jwt_payload就是解密后的token,用他的_id在user模型中查找是否存在,并返回相应的true和false
    if(user){
      return done(null, user)
    }else{
      return done(null, false)
    }
}));
}

4.在用户登录时生成token

引入jsonwebtoken来生成token

const jwt = require('jsonwebtoken')

在用户登录的路由中使用 jwt.sign 来生成,一共定义三个参数,第一个是存入token的信息,第二个是token的钥匙,和config/passport.js的配置的钥匙相同,第三个是保存的时间,3600即一个小时,最后返回token,要在前面加Bearer

const token = jwt.sign({_id: res._id,username: res.username}, 'secret', {expiresIn: 3600})
      ctx.body = {
        token: `Bearer ${token}`,
        msg: '验证成功'
      }

5.在需要验证token的路由中间件验证token

引入

const passport = require('koa-passport')

在中间件验证

passport.authenticate('jwt', { session: false })

在相应路由中就可以通过ctx.state.user拿到config/passport.js配置里面返回的用户信息

需要验证token的路由,前端必须在请求头中加

Authorization: 后端返回的token值

你可能感兴趣的:(nodejs)