koa-passport实现本地验证的方法示例


Posted in Javascript onFebruary 20, 2020

安装

yarn add koa-passport passport-local

先看下passport.js登录策略,判断用户和密码

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

passport.use(new LocalStrategy((username, password, done) => {
 User.findOne({username}, (err, user) => {
  if (err) return done(err)
  if (!user) return done(null, false, {message: '用户不存在'})
  if (user.password !== password) return done(null, false, {message: '密码错误'})
  return done(null, user)
 })
}))

passport.serializeUser((user, done) => {
 done(null, user)
})

passport.deserializeUser((user, done) => {
 done(null, user)
})

module.exports = passport

在入口中挂载passport

app.use(passport.initialize())
app.use(passport.session())

这时候passport策略配置完成

登录接口实现

router.post('/signin', async ctx => {
 return Passport.authenticate('local', (err, user, info, status) => {
  if (err) {
   ctx.body = {
    code:-1,
    msg:err
   }
  }else {
   if (user) {
    ctx.body = {
     code:0,
     msg:'登录成功',
     user
    }
    return ctx.login(user)
   } else {
    ctx.body = {
     code:1,
     msg:info
    }
   }
  }
 })(ctx)
})

用户是否登录

router.get('/getUser', async ctx => {
 if (ctx.isAuthenticated()){
  const {username, email} = ctx.session.passport.user
  ctx.body = {
   username,
   email
  }
 } else {
  ctx.body = {
   username: '',
   email: ''
  }
 }
})

用户退出

router.get('/exit', async ctx => {
 await ctx.logout()
 if (!ctx.isAuthenticated()) {
  ctx.body = {
   code:0
  }
 } else {
  ctx.body = {
   code:-1
  }
 }
})

分析

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

到此这篇关于koa-passport实现本地验证的方法示例的文章就介绍到这了,更多相关koa-passport 本地验证内容请搜素三水点靠木以前的文章或下面相关文章,希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
Knockout数组(observable)使用详解示例
Nov 15 Javascript
js css 实现遮罩层覆盖其他页面元素附图
Sep 22 Javascript
js字符串完全替换函数分享
Dec 03 Javascript
javascript 获取浏览器版本
Jan 21 Javascript
BootStrap下拉框在firefox浏览器界面不友好的解决方案
Aug 18 Javascript
使用JQuery中的trim()方法去掉前后空格
Sep 16 Javascript
原生js实现新闻列表展开/收起全文功能
Jan 20 Javascript
js通过keyCode值判断单击键盘上某个键,然后触发指定的事件方法
Feb 19 Javascript
node将geojson转shp返回给前端的实现方法
May 29 Javascript
JavaScript和TypeScript中的void的具体使用
Sep 12 Javascript
vue使用axios实现excel文件下载的功能
Jul 16 Javascript
vue props default Array或是Object的正确写法说明
Jul 30 Javascript
javaScript 实现重复输出给定的字符串的常用方法小结
Feb 20 #Javascript
一篇文章带你浅入webpack的DLL优化打包
Feb 20 #Javascript
浅析JS中NEW的实现原理及重写
Feb 20 #Javascript
JS通过识别id、value值对checkbox设置选中状态
Feb 19 #Javascript
Javascript实现html转pdf高清版(提高分辨率)
Feb 19 #Javascript
Vue组件模板的几种书写形式(3种)
Feb 19 #Javascript
详解Vue 单文件组件的三种写法
Feb 19 #Javascript
You might like
PHP中实现汉字转区位码应用源码实例解析
2010/06/14 PHP
PHP之浮点数计算比较以及取整数不准确的解决办法
2015/07/29 PHP
简单介绍win7下搭建apache+php+mysql开发环境
2015/08/06 PHP
PHP基于phpqrcode类生成二维码的方法示例详解
2020/08/07 PHP
宝塔面板在NGINX环境中TP5.1如何运行?
2021/03/09 PHP
JavaScript中的私有成员
2006/09/18 Javascript
增强的 JavaScript 的 trim 函数的代码
2007/08/13 Javascript
JS实现的新浪微博大厅文字内容滚动效果代码
2015/11/05 Javascript
win7下安装配置node.js+express开发环境
2015/12/06 Javascript
Angularjs整合微信UI(weui)
2016/03/15 Javascript
JavaScript DOM节点操作方法总结
2016/08/23 Javascript
bootstrap实现每隔5秒自动轮播效果
2016/12/20 Javascript
JavaScript中的高级函数
2018/01/04 Javascript
nodejs+mongodb aggregate级联查询操作示例
2018/03/17 NodeJs
vue.js与element-ui实现菜单树形结构的解决方法
2018/04/21 Javascript
小程序测试后台服务的方法(ngrok)
2019/03/08 Javascript
使用webpack/gulp构建TypeScript项目的方法示例
2019/12/18 Javascript
[01:02:38]DOTA2-DPC中国联赛定级赛 LBZS vs Phoenix BO3第二场 1月10日
2021/03/11 DOTA
Python中取整的几种方法小结
2017/01/06 Python
Python比较2个时间大小的实现方法
2018/04/10 Python
python 拼接文件路径的方法
2018/10/23 Python
Django使用unittest模块进行单元测试过程解析
2019/08/02 Python
Django 1.10以上版本 url 配置注意事项详解
2019/08/05 Python
Python中*args和**kwargs的区别详解
2019/09/17 Python
Python实现大数据收集至excel的思路详解
2020/01/03 Python
Python如何把十进制数转换成ip地址
2020/05/25 Python
如何用python处理excel表格
2020/06/09 Python
pytorch VGG11识别cifar10数据集(训练+预测单张输入图片操作)
2020/06/24 Python
使用Python项目生成所有依赖包的清单方式
2020/07/13 Python
Python os库常用操作代码汇总
2020/11/03 Python
adidas澳大利亚官方网站:adidas Australia
2018/04/15 全球购物
2015年基层党组织公开承诺书
2015/01/21 职场文书
骨干教师个人总结
2015/02/11 职场文书
对公司的意见和建议
2015/06/04 职场文书
《海上日出》教学反思
2016/02/23 职场文书
Java内存模型之happens-before概念详解
2021/06/13 Java/Android