Node正在兴起!我从2010年就开始玩并使用Node工作,那个时侯我看着它从一个小的个人hack项目成长为一个能够供开发者使用来构建真实、重要及大型应用的全面型构建工具。生态系统型解决方案如雨后春笋般涌现,在助力开发者的同时使生态系统也迅速发展着。但随着它的快速增长也越来越难找到最适合你的解决方案,因为来自谷歌搜索或npm的干扰。
认证和用户管理绝对是块困难且变化多端的战场。然而,当创建一个实际的Node应用时,这却是第一位需要确认的组件。本指南的目的是给你展现Node中用户管理和认证的全面。
相关阅读:
Ubuntu 编译安装Node.js
Node中有哪些可用选择?
目前Node中有几个不同的路径来构建用户管理。它们的无序排列如下:
Passport.js / Everyauth
自己的数据库及哈希算法
用户管理即服务
Passport.js / EveryauthPassportJS和Everyauth是一个Node处理连接中间件协议的认证中间件。这意味着如果你使用Express、Restify或Sails等框架,你就可以很容易地将其中一个认证方案(或策略)直接插入你的应用中。Everyauth配合其嵌入策略,就像通行证时可以选择使用的策略一样。一些开发者的经常配合通行证使用的策略是Facebook和Google的,但这也包括诸如本地用户名/密码认证到一系列的OpenID、OAuth提供器等的一切,甚至是一个Stormpath通行策略。
尽管 Everyauth 和 Passport 都建立在同一个中间件框架之上,他们有自己的一套利弊。Passport 更加灵活和模块化的,但 Everyauth 提供了对路由和登录/注册有所帮助的额外的功能。对于很多 Node 开发员,Passport 也是首选的,因为它不使用承诺。
由于 Passport 和 Everyauth 都是建立在 Connect 上的,他们都将帮助你实现会话管理,其中包括:
序列化经过身份验证的用户
会话管理
注销用户
此外,它们非常适用于简单和容易的用户验证,但由于设计上的局限,并不适用于属于更广泛的用户管理需求。你还是需要设计,实施和维护其他用户验证需要的基础设施。
例如,如果你使用的是本地通行证(针对自己数据库的用户名密码验证策略),Passport 没有处理用户的注册及账户的验证。你需要使用数据库模块来进行身份鉴定,创建账户,追踪验证状态,创建验证令牌,发送邮件,以及验证账户。这意味着开发者会需要担心 URL 的安全性,移除过期的令牌,以及其它的安全约束(如数据库中密码的正确散列)。
自己的数据库及哈希算法DIY 的方法不依赖于任何中间件。选择自己的栈,存储用户所用的数据库(可能是 PostgresSQL 或 MongoDB),以及一个用来生成密码散列的哈希算法(可能是 bcrypt 或 scrypt)。在 npm 中搜索 bcrypt 或 scrypt 会导致不少模块在质量上的变化,每个模块都有自己的依赖集合。如果你是 Windows 开发者,请特别注意 – 我们推荐 Javascript 原生实现的 bcrypt 。
选定栈后,你需要增加用户管理和身份验证。从历史上看,这种方式极其常见,但是与其它方式相比,它冗长乏味、易于出错、需要更多的维护。
你需要增加/解决:
账户创建
创建用户模式来保持用户数据
创建账户及存储那些使用 bcrypt / scrypt 盐化(增加随机字串)、散列过的密码
发送带有账户验证令牌的邮件
账户身份验证
验证用户身份(比较散列值)
账户管理
生成 / 失效令牌
密码复位的工作流
基于角色的访问/许可
ID 与 社会服务提供商的集成
系统安全
保护数据库以免于未授权访问
保护操作系统以免于未授权访问
数据备份