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