://blog.risingstack.com/node-hero-node-js-authentication-passport-js/在本教程中,学习如何实现一个使用Passport.js和Redis的本地Node.js身份验证策略。使用的技术在深入研究实际代码之前,让我们看一下我们将在本章中使用的新技术。什么是Passport.js?简单、简洁的Node.js身份验证-passportjs.orgPassport是我们将用于会话管理的Node.js身份验证中间件。什么是Redis?Redis是一个开源(BSD许可)内存数据结构存储库,用作数据库、缓存和消息代理中间件-redis.io。我们打算将用户的会话信息存储在Redis中,而不是存储在会话进程的内存中。这样,我们的应用程序将更容易扩展。演示应用程序出于演示目的,让我们创建一个仅执行以下操作的应用程序:显示登录表单,显示两个安全页面:个人资料页面,安全注释项目结构在上一章中,您已经学习了如何构建Node.js项目,因此让我们开始使用我们学到的东西吧!我们打算使用以下结构:├──app|├──认证|├──注意|├──用户|├──index.js|└──layout.hbs├──配置|└──index.js├──index.js└──package.json如你所见,我们围绕功能组织文件和目录。我们将有一个用户页面、一个注释页面和一些与身份验证相关的功能。完整的代码下载地址为https://github.com/RisingStack/nodehero-authentication。*Node.js身份验证流程我们的目标是在我们的应用程序中实现以下身份验证流程:用户输入名称和密码,应用程序检查匹配项,如果匹配,则发送Set-Cookie响应标头并将其用于身份验证后续pages当用户访问同一域的页面时,先前设置的cookie将添加到所有请求中使用此cookie验证受限页面要设置这样的身份验证策略,请执行以下三个步骤:1.第1步:设置ExpressWe'我们将使用Express作为服务器框架——您可以通过阅读我们的Express教程了解更多关于这个主题的信息。//file:app/index.jsconstexpress=require('express')constpassport=require('passport')constsession=require('express-session')constRedisStore=require('connect-redis')(session)constapp=express()app.use(session({store:newRedisStore({url:config.redisStore.url}),secret:config.redisStore.secret,resave:false,saveUninitialized:false}))app.use(passport.initialize())app.use(passport.session())我们在这里做什么?首先,我们需要所有会话管理依赖项。之后,我们从express-session模块创建一个新实例,并用它来存储会话。对于后备存储,我们使用Redis。但是,您可以使用任何其他数据库,例如MySQL或MongoDB。第二步:设置Node.jsPassportPassport是一个很好的使用插件的示例库。对于本教程,我们添加了passport-local模块,它允许我们使用用户名和密码轻松集成简单的本地身份验证策略。为简单起见,在这个例子中我们没有使用第二个后备存储,只是一个内存中的用户实例。在实际应用程序中,findUser会在数据库中查找用户。//file:app/authenticate/init.jsconstpassport=require('passport')constLocalStrategy=require('passport-local').Strategyconstuser={用户名:'test-user',密码:'test-password',id:1}passport.use(newLocalStrategy(function(username,password,done){findUser(username,function(err,user){if(err){returndone(err)}if(!user){returndone(null,false)}if(password!==user.password){returndone(null,false)}returndone(null,user)})}))一旦findUser返回用户对象,唯一的事情left是比较提供的用户和真实密码,看是否匹配。如果匹配,则让用户进入(通过将用户返回到passport-returndone(null,user));如果不是,则返回一个未经授权的错误(通过不向护照返回任何内容-返回完成(null))。第3步:添加受保护的端点要添加受保护的端点,您可以利用Express使用的中间件模式。为此,首先创建身份验证中间件://file:app/authentication/middleware.jsfunctionauthenticationMiddleware(){returnfunction(req,res,next){if(req.isAuthenticated()){returnnext()}res.redirect('/')}}这段代码有一个功能,就是如果用户通过了身份验证(使用正确的cookies),调用下一个中间件;否则,重定向到用户登录页面。这样做就像在路由定义中添加新的中间件一样简单。//file:app/user/init.jsconstpassport=require('passport')app.get('/profile',passport.authenticationMiddleware(),renderProfile)总结在本教程中,您学习了如何给应用添加基本认证。之后,可以使用不同的身份验证策略对其进行扩展,例如Facebook或Twitter。更多策略可以在http://passportjs.org/找到。完整的示例代码在GitHub上,您可以在这里查看:https://github.com/RisingStack/nodehero-authentication。后续步骤下一章主要关注单元测试Node.js应用程序。您将学习单元测试、测试金字塔、测试替换等概念。
