本文转载自:众成翻译
译者:网络埋伏纪事
连接:http://www.zcfy.cc/article/1755
原文:https://blog.risingstack.com/node-hero-node-js-authentication-passport-js/node
本教程中将学习如何使用 Passport.js 和 Redis 实现一个本地 Node.js 身份验证策略。git
在一头扎进实际代码以前,咱们先看看本章中要用到的新技术。github
简单、 不花哨的 Node.js 身份验证 - passportjs.orgredis
Passport 是一个 Node.js 身份认证中间件,咱们将把它用于会话管理。数据库
Redis 是一个开源的(BSD 许可)、内存中的数据结构仓库,被用做数据库、缓存和消息代理中间件 - redis.io。express
咱们打算把用户的会话信息存到 Redis 中,而不是在会话过程的内存中。经过这种方式,咱们的应用程序会更容易扩展一些。json
出于演示目的,下面咱们建立一个只作以下事情的应用程序:缓存
显示一个登陆表单,服务器
显示两个受保护页面:cookie
概述(profile)页面,
secured notes
在前一章你已经学习了如何组织 Node.js 项目的结构,因此下面咱们就开始用所学的知识!
咱们打算采用以下结构:
├── app | ├── authentication | ├── note | ├── user | ├── index.js | └── layout.hbs ├── config | └── index.js ├── index.js └── package.json
正如你所见,咱们会围绕着功能来组织文件和目录。咱们将有一个用户页,一个备注页,和一些与身份验证相关的功能。
完整的代码下载在 https://github.com/RisingStack/nodehero-authentication。*
咱们的目标是实现以下的身份验证流程到咱们的应用程序中:
用户输入姓名和密码
应用程序检查是否匹配
若是匹配,就发送一个 Set-Cookie
响应头,用它来验证以后的页面
当用户从同一域访问页面时,以前设置的 cookie 会被添加到全部的请求中
用这个 cookie 验证受限制的页面
为设置像这样的身份验证策略,请遵循以下三个步骤:
咱们打算用 Express 做为服务器框架 - 能够经过阅读咱们的 Express 教程,来学习更多关于此主题的知识。
// file:app/index.js const express = require('express') const passport = require('passport') const session = require('express-session') const RedisStore = require('connect-redis')(session) const app = express() app.use(session({ store: new RedisStore({ url: config.redisStore.url }), secret: config.redisStore.secret, resave: false, saveUninitialized: false })) app.use(passport.initialize()) app.use(passport.session())
在这里咱们作了什么?
首先,咱们 require 了全部会话管理所需的依赖。以后,咱们从 express-session
模块建立了一个新的实例,用它来存储会话。
为后备存储,咱们用了 Redis。可是,你可使用任何其它数据库,好比 MySQL 或者 MongoDB。
Passport 是使用插件的一个很好的示例库。对于本教程,咱们添加 passport-local
模块,该模块让咱们能够很容易集成使用用户名和密码的简单本地身份验证策略。
为简单起见,在本例中,咱们没有使用第二个后备存储,只用了一个内存中的 user 实例。在真实应用程序中,findUser
会在数据库中查找一个用户。
// file:app/authenticate/init.js const passport = require('passport') const LocalStrategy = require('passport-local').Strategy const user = { username: 'test-user', password: 'test-password', id: 1 } passport.use(new LocalStrategy( function(username, password, done) { findUser(username, function (err, user) { if (err) { return done(err) } if (!user) { return done(null, false) } if (password !== user.password ) { return done(null, false) } return done(null, user) }) } ))
一旦 findUser
返回 user 对象,剩下的惟一的事情是比较提供的用户以及真实密码,看看是否匹配。
若是匹配,就让用户进入(经过将用户返回给 passport - return done(null, user)
);若是不匹配,就返回一个未受权错误(经过什么都不返回给 passport - return done(null)
)。
要添加受保护的端点,就得利用 Express 所用的中间件模式。为此,先建立身份验证中间件:
// file:app/authentication/middleware.js function authenticationMiddleware () { return function (req, res, next) { if (req.isAuthenticated()) { return next() } res.redirect('/') } }
这段代码有一个做用,就是若是用户被验证(有正确的 cookies),就调用下一个中间件;不然就重定向到用户登陆页面。
用这种方式与把新中间件添加到路由定义同样简单。
// file:app/user/init.js const passport = require('passport') app.get('/profile', passport.authenticationMiddleware(), renderProfile)
在本教程中,你已经学习了如何给应用程序添加基础的身份验证。以后,就能够用不一样的身份验证策略扩展它,好比 Facebook 或 Twitter。在 http://passportjs.org/ 上能够找到更多策略。
完整的示例代码放在 GitHub 上,你能够看看这里:https://github.com/RisingStack/nodehero-authentication。
下一章主要涉及 Node.js 应用程序的单元测试。你会学习单元测试、测试金字塔、测试替代等概念。