koa-passport做登录注册验证

一、安装

 npm i koa-passport passport-local -s

二、注册策略

在passport.js里注册策略:

const passport = require('koa-passport')
const LocalStrategy = require('passport-local')
const UserModel = require('../../dbs/models/users')


passport.use(new LocalStrategy(async function (username, password, done) {
  /**
    * @param username 用户输入的用户名
    * @param password 用户输入的密码
    * @param done 验证验证完成后的回调函数,由passport调用
    */
  let where = {
    username
  };
  let result = await UserModel.findOne(where)
  if (result != null) {
    if (result.password === password) {
      return done(null, result)
    } else {
      return done(null, false, '密码错误')
    }
  } else {
    return done(null, false, '用户不存在')
  }
}))
// serializeUser 在用户登录验证成功以后将会把用户的数据存储到 session 中
passport.serializeUser(function (user, done) {
  done(null, user)
})

passport.deserializeUser(function (user, done) {
  return done(null, user)
})

module.exports = passport;

三、挂载passport

在入口中挂载passport

import passport from './interface/utils/passport'
...
app.use(passport.initialize())
app.use(passport.session())
...

这时候passport策略配置完成。

四、调用策略

在定义登录接口的文件users.js里调用策略

import Router from'koa-router'
import Passport from'./utils/passport'
let router = new Router({
  prefix: '/users'
})
//登录接口
router.post('/signin', async (ctx, next) => {
  return Passport.authenticate('local', function(err, user, info, status) {
    if (err) {
      ctx.body = {
        code: -1,
        msg: err
      }
    } else {
      if (user) {
        console.log(user,1111)
        ctx.body = {
          code: 0,
          msg: '登录成功',
          user
        }
        return ctx.login(user)
      } else {
        ctx.body = {
          code: 1,
          msg: info
        }
      }
    }
  })(ctx, next)
})
//获取用户信息接口
router.get('/getUser', async (ctx) => {
  if (ctx.isAuthenticated()) {
    const {username, email} = ctx.session.passport.user
    ctx.body={
      user:username,
      email
    }
  }else{
    ctx.body={
      user:'',
      email:''
    }
  }
})
//退出接口
router.get('/exit', async (ctx, next) => {
  await ctx.logout()
  if (!ctx.isAuthenticated()) {
    ctx.body = {
      code: 0
    }
  } else {
    ctx.body = {
      code: -1
    }
  }
})

module.exports = router

passport.serializeUser函数定义序列化操作,调用ctx.login()会触发序列化操作
通过passport.deserializeUser函数定义反序列化操作,在session中如果存在passport:{user:'Susan'}会触发反序列化操作
通过passport.use(new LocalStrategy('local', ...)) 注册策略,调用passport.authenticate('local',...)调用策略
app.use(passport.initialize()) 会在ctx挂载以下方法
ctx.state.user 认证用户
ctx.login(user) 登录用户
ctx.logout() 用户退出登录
ctx.isAuthenticated() 判断是否认证

原文地址:https://www.cnblogs.com/superlizhao/p/12117064.html