热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在express框架下使用passport实现验证(0)。

前面2个文章说明了cookiesession保存、验证用户的方法都有各自的缺点。现在推荐一个使用passport的方法验证用户。这里的代码是基于上一遍文章(express框架下使用

前面2个文章说明了COOKIE/session保存、验证用户的方法都有各自的缺点。现在推荐一个使用passport的方法验证用户。
这里的代码是基于上一遍文章(express框架下使用session)的代码。
关于passport的学习差不多一个月了,还是有搞不清的地方,不过可以正常简单使用完成登录、验证、登出功能。passport的笔记分为2部分。基本使用方法和使用jwt.

基本使用方法。

这部分目的在于说清passport的工作过程。

  1. 安装依赖。

npm i passport passport-local passport-local-mongoose

  1. 在app.js中挂载并配置passport

// app.js
var passport = require('passport')
var authenticate = require('authenticate')
// 在app.use(session())后
app.use(passport.initialize())
app.use(passport.session())
// authenticate.js
var passport = require('passport'),
LocalStrategy = require('passport-local').Strategy,
User = require('./models/user')
passport.use(new LocalStrategy(User.authenticate())) // passport.use(new LocalStrategy()) 是配置验证策略。User.authenticate是plm为user添加的静态方法,用来验证用户的。可是它返回了什么?
passport.serializeUser(User.serializeUser()) // plm提供的静态方法。passport.serializeUser()为了建立持续的session必须序列化session.再在后序的请求中反序列化。
passport.deserializeUser(User.deserializeUser()) // plm提供的静态方法

  1. 在models/user.js中使用passport-local-mogoose(plm)

var mOngoose= require('mongoose'),
Schema = mongoose.Schema,
passportLocalMOngoose= require('passport-local-mongoose'),
User = new Schema({
admin: {
type: Boolean,
default: false
}
})
User.plugin(passportLocalMongoose)
module.exports = mongoose.model('User', User)

  1. 在routes/users.js中使用plm的注册、验证方法。

router.post('/signup', (req, res, next) => {
console.log(req.body)
User.register(new User({username: req.body.username}),
req.body.password,
(err, user) => {
if (err) {
res.statusCode = 500,
res.json({err: err})
} else {
passport.authenticate('local')(req, res, () => {
res.statusCode = 200
res.json({success: true, status: 'registration successful!'})
})
}
})
})
router.post('/login', passport.authenticate('local'), (req, res) => {
res.statusCode = 200
res.json({success: true, status: 'you are successful logged in!'})
})
router.get('/logout', (req, res, next) => {
if (req.session) {
req.session.destroy()
res.clearCOOKIE('session-id')
res.send('登出成功。重定向的事让前端做')
} else {
var err = new Error('you are not logged in!')
err.status = 403
next(err)
}
})

  1. 登录后才能访问的页面

// app.js
// 先写不需要登录的路由
// app.use('/router0', router0)
// 这是验证是否登录的中间件.
app.use((req, res, next) => {
if (req.isAuthenticated()) {
next()
} else {
// 返回相应信息
res.send('请登录后访问.')
// 也可以重定向到登录页面
// res.redirect('/login')
// 也可以进入错误页面.
// res.redirect('/error')
}
})
// 再写需要登录的路由
// app.use('/router1', router1)

回顾上面的例子。主要做了

  1. 安装、引入。
  2. 配置。
  3. 登录时使用策略验证。
  4. 为需要登录后才能访问的页面使用验证.

在npm上passport的文档。

策略

passport就是为验证请求而生的。它有好多验证策略。可以使用本地验证策略,可以使用委托验证,可以使用openID验证。
在使用验证前都需要配置passport.下面是配置的demo

passport.use(new LocalStrategy(authcb))

session

passport会维持登录session.为了使用session一直工作,所以验证用户时必须序列化,再在后续的请求的反序列化。
passport不会暴露任何如何保存用户记录的方法。所以需要程序员提供序列化和反序列化逻辑。下面是一个例子,保存时序列化了用户id,取时根据反序列化的用户id找到user.

passport.serializeUser((user, done) => {
done(null, user.id)
})
passport.deserializeUser((id, done) => {
User.findById(id, (err, user) => {
done(null, user.id)
})
})

中间件

若在express/connect应用中使用要passport,则需要挂载passport.initialize()中间件。
若使用持续session.(建议但不强制),则挂载passport.session()中间件。

app.use(session())
app.use(passport.initialize()) // 这两个方式到底做了什么,还需要去看原码。
app.use(passport.session())

验证请求

passport提供了一个在路由中验证请求的方法——authenticate()

app.post('/login', passport.authenticate('local', {failureRedirect: '/login'}), (req, res) => {
res.redirect('/')
} )

passport的方法

use([strategyName, ]strategy)绑定需要使用的策略。
initiallize()返回初始化passport的中间件。
session()返回使用session的中间件。
serializeUser(fn)序列化后保存到session里。
deserializeUser(fn)从session里取数据时反序列化。
authenticate(strategyName, options, fn)进行验证。

passport为req添加的方法

初始化时添加的。

别名
logIn(user, options, cb)login()登录
logOut()logout()
isAuthenticated()当前用户是否登录。
isUnauthenticated()当前用户是否没登录。

passport 基本使用方法

初始化:app.use(passport.initialize());
安装策略: passport.use(new BasicStrategy(…))
使用策略:app.get(‘/…’, passport.authenticate(‘basic’),(req,res)=>{…})
其他方便函数:
req.user 登陆后存在
req.login() 仅在注册时手工调用。登陆时由策略自动调用。
req.logout() 登出时调用

无session的,如basic-auth,在每次使用时都要检查

app.get('/api/users/me',
passport.authenticate('basic', { session: false }),
function(req, res) {
res.json({ id: req.user.id, username: req.user.username });
});

有session的,在第一次由策略得到user。之后每次由sessionid对应的session得到user。

策略=>user 又分为2步
web数据=>策略参数
策略参数=>user

sessiOnid=>user 也包含2件事
serializeUser: user=>sessionid
deserializeUser: sessiOnid=>user


推荐阅读
  • 本文介绍了如何使用 Node.js 和 Express(4.x 及以上版本)构建高效的文件上传功能。通过引入 `multer` 中间件,可以轻松实现文件上传。首先,需要通过 `npm install multer` 安装该中间件。接着,在 Express 应用中配置 `multer`,以处理多部分表单数据。本文详细讲解了 `multer` 的基本用法和高级配置,帮助开发者快速搭建稳定可靠的文件上传服务。 ... [详细]
  • 如何在Linux服务器上配置MySQL和Tomcat的开机自动启动
    在Linux服务器上部署Web项目时,通常需要确保MySQL和Tomcat服务能够随系统启动而自动运行。本文将详细介绍如何在Linux环境中配置MySQL和Tomcat的开机自启动,以确保服务的稳定性和可靠性。通过合理的配置,可以有效避免因服务未启动而导致的项目故障。 ... [详细]
  • 为了确保iOS应用能够安全地访问网站数据,本文介绍了如何在Nginx服务器上轻松配置CertBot以实现SSL证书的自动化管理。通过这一过程,可以确保应用始终使用HTTPS协议,从而提升数据传输的安全性和可靠性。文章详细阐述了配置步骤和常见问题的解决方法,帮助读者快速上手并成功部署SSL证书。 ... [详细]
  • 在 Vue 应用开发中,页面状态管理和跨页面数据传递是常见需求。本文将详细介绍 Vue Router 提供的两种有效方式,帮助开发者高效地实现页面间的数据交互与状态同步,同时分享一些最佳实践和注意事项。 ... [详细]
  • 在探讨Hibernate框架的高级特性时,缓存机制和懒加载策略是提升数据操作效率的关键要素。缓存策略能够显著减少数据库访问次数,从而提高应用性能,特别是在处理频繁访问的数据时。Hibernate提供了多层次的缓存支持,包括一级缓存和二级缓存,以满足不同场景下的需求。懒加载策略则通过按需加载关联对象,进一步优化了资源利用和响应时间。本文将深入分析这些机制的实现原理及其最佳实践。 ... [详细]
  • 本文详细介绍了使用 Python 进行 MySQL 和 Redis 数据库操作的实战技巧。首先,针对 MySQL 数据库,通过 `pymysql` 模块展示了如何连接和操作数据库,包括建立连接、执行查询和更新等常见操作。接着,文章深入探讨了 Redis 的基本命令和高级功能,如键值存储、列表操作和事务处理。此外,还提供了多个实际案例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 重要知识点有:函数参数默许值、盈余参数、扩大运算符、new.target属性、块级函数、箭头函数以及尾挪用优化《深切明白ES6》笔记目次函数的默许参数在ES5中,我们给函数传参数, ... [详细]
  • 技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统
    技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统 ... [详细]
  • 您的数据库配置是否安全?DBSAT工具助您一臂之力!
    本文探讨了Oracle提供的免费工具DBSAT,该工具能够有效协助用户检测和优化数据库配置的安全性。通过全面的分析和报告,DBSAT帮助用户识别潜在的安全漏洞,并提供针对性的改进建议,确保数据库系统的稳定性和安全性。 ... [详细]
  • PTArchiver工作原理详解与应用分析
    PTArchiver工作原理及其应用分析本文详细解析了PTArchiver的工作机制,探讨了其在数据归档和管理中的应用。PTArchiver通过高效的压缩算法和灵活的存储策略,实现了对大规模数据的高效管理和长期保存。文章还介绍了其在企业级数据备份、历史数据迁移等场景中的实际应用案例,为用户提供了实用的操作建议和技术支持。 ... [详细]
  • feat: Enhances Jest Testing Capabilities with Snapshot Support ... [详细]
  • 在 Android 开发中,`android:exported` 属性用于控制组件(如 Activity、Service、BroadcastReceiver 和 ContentProvider)是否可以被其他应用组件访问或与其交互。若将此属性设为 `true`,则允许外部应用调用或与之交互;反之,若设为 `false`,则仅限于同一应用内的组件进行访问。这一属性对于确保应用的安全性和隐私保护至关重要。 ... [详细]
  • C++ 异步编程中获取线程执行结果的方法与技巧及其在前端开发中的应用探讨
    本文探讨了C++异步编程中获取线程执行结果的方法与技巧,并深入分析了这些技术在前端开发中的应用。通过对比不同的异步编程模型,本文详细介绍了如何高效地处理多线程任务,确保程序的稳定性和性能。同时,文章还结合实际案例,展示了这些方法在前端异步编程中的具体实现和优化策略。 ... [详细]
  • 在处理木偶评估函数时,我发现可以顺利传递本机对象(如字符串、列表和数字),但每当尝试将JSHandle或ElementHandle作为参数传递时,函数会拒绝接受这些对象。这可能是由于这些句柄对象的特殊性质导致的,建议在使用时进行适当的转换或封装,以确保函数能够正确处理。 ... [详细]
author-avatar
铁匠他夫人_738
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有