• 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() 判断是否认证

  • 相关阅读:
    JS中常遇到的浏览器兼容问题和解决方法
    遍历
    深度克隆和浅拷贝
    js数据类型
    js运算符
    理解js中的事件模型
    常见事件总结
    模板方法模式
    适配器模式和外观模式
    命令模式
  • 原文地址:https://www.cnblogs.com/superlizhao/p/12117064.html
Copyright © 2020-2023  润新知