英文原文:https://stormpath.com/blog/choosing-nodejs-authentication-strategy/

Node.js正在兴起!2010年就开始使用Node工作,那个时侯我看着它从一个很小的个人项目成长为一个全功能的、能够让现代开发者用于构建真实、重要的大型应用的主要工具。一个完整的解决方案生态系统如雨后春笋般涌现,既帮助了Node开发者,也促使生态系统自身快速演进。但随着它的快速演进,要找到最适合你的解决方案就变得越来越难,因为来自谷歌搜索或npm的噪声太多(译者注:Node.js的第三方库太过庞大,以至于难以选择最适合的)。
授权认证和用户管理尤其是块困难且变化多端的领域。但是,当你用Node创建实际的应用时,它却是你所需的第一个组件。本指南的目的是向你展现用Node如何实现用户管理和授权认证。

Node生态圈有哪些可用选择?

目前Node生态圈在构建用户管理有几种不同的方法。大致上有:
1)Passport.js库或Everyauth库
PassportJS:http://passportjs.org/
Everyauth:https://github.com/bnoguchi/everyauth
2)使用自己的数据库及哈希算法
3)采用“用户管理即服务”的云服务

Passport.js / Everyauth

PassportJS和Everyauth都是Node的授权认证中间件,两者都利用了Connect中间件框架。这意味着如果你使用了Express、Restify或Sails等框架,你可以很容易地将其中任意一个认证中间件(或策略)直接集成到你的应用中。Everyauth只适合嵌入策略,然而PassportJS则可以选择要使用的策略。开发者使用PassportJS通常采取的策略是Facebook和Google,但还包括来自本地的用户名/密码认证,到大量的OpenID、OAuth第三方认证,甚至PassportJS的Stormpath策略。
注:Stormpath是一个用户管理API,它减少了开发时间,提供了即开即用的用户管理基础设施。Stormpath直观的API和专家支持使得开发授权认证、管理、安全的用户和角色变得很容易。

尽管 Everyauth 和 Passport 都建立在同一个中间件框架Connect之上,单他们各有自己的优缺点。Passport 更灵活、更模块化,而Everyauth则提供了额外的功能,支持路由和登录/注册视图。但是很多Node开发者选择了Passport,因为它不使用承诺。  
由于 Passport 和 Everyauth 都是建立在 Connect 上的,两者都能帮助你实现会话管理,包括:  
1)身份已认证的用户的序列化
2)会话管理 
3)注销用户

此外,它们很适用于简单的、简易的用户授权认证,但由于设计上的局限,并不适用于复杂的用户管理需求。你仍然需要设计、实现和维护你的用户管理基础设施的其它部分。
例如,如果你使用的是passport-local策略(此策略需要把授权认证所需的用户名和密码存入你自己的数据库),Passport自身不处理用户的注册及账户的认证。你需要使用数据库模块来进行身份鉴定、创建账户、跟踪认证状态、创建认证令牌、发送邮件,以及验证账户。这意味着开发者会需要考虑URL的安全性、移除过期的令牌,以及其它的安全约束(如数据库中密码的正确散列)。

使用自己的数据库及哈希算法

DIY 的方法不依赖于任何中间件。选择自己的技术栈,用数据库来存储用户信息(可能是 PostgreSQL 或 MongoDB),并使用哈希算法生成密码散列(可能是bcrypt或scrypt)。在npm中搜索bcrypt或scrypt会导致不少模块在质量上的变化,bcrypt或scrypt模块都有自己的依赖集。要特别注意的是,如果你使用Windows开发,我们推荐bcrypt的原生JS实现,见https://github.com/shaneGirish/bcrypt-nodejs。
选定技术栈后,你需要建立用户管理和授权认证。从历史上看,这种方式极其常见,但与其它方式相比,它冗长乏味、易于出错、且需要更多的维护。
你需要增加/解决:
1)账户创建
• 创建用户模式来保持用户数据
• 创建账户及存储使用bcrypt/scrypt散列并加盐后的密码
• 发送带有账户认证令牌的邮件
2)账户授权认证
• 验证用户身份(比较散列值)
3)账户管理
• 密码复位的工作流(产生令牌/让令牌失效)
• 基于角色的访问/许可
4)用ID与第三方社交认证服务商的集成
5)系统安全
• 阻止未授权访问数据库
• 阻止未授权访问操作系统
6)数据备份

授权认证和用户管理的最大的挑战是维护。以密码散列为例,正确的方法是,你基于成本因素选择的哈希算法,为防止暴力攻击特意使散列算法减慢(约300~700毫秒)。但是今天认为是正确的,在明天就可能是不安全的。如果你正在创建的应用程序即将上线,那么你应该每年更换一次散列策略。
尽管Node社区反对这种方式,但这种方式也有一些好处。你可以完全控制自己的基础设施。如果你的工具还没有足够好到可以交付给你的客户、满足复杂的需求,那么你就该向身份认证和用户管理投入人力物力。幸运的是,应用程序和开发者很少有这种需求,所以开源工具以及开放API服务可以帮助我们更快、更好的交付产品。

用户管理即服务

随着时间的推移,软件已经从本地到云端发布,再到分布式API服务。与此同时,开发团队也开始依赖开源软件和开放API服务,甚至和自己的代码一样重要。因此,把自己的用户管理模块卸下来,使用REST API和开放SDK来实现新的用户管理,完成应用程序的开发。Stormpath 支持这种方式。特别是Node社区,已经采取这种面向服务的模式,远远领先于其它语言的任何社区。
通常情况下,API驱动的服务围绕用户管理方面提供了更常规的功能,而且不仅是授权认证。服务供应商还提供了各种额外的功能,通常包括: 
1)帐户的电子邮件验证
2)密码重置工作流程
3)基于角色的访问/权限
4)无模式的用户配置文件
5)双重因素身份认证
6)应用程序间的单点登录
7)社交登录的集成(Facebook、谷歌等)
8)与Node的认证中间件如 Passport的集成

除了这些纯粹的功能,它还提供相当可靠的安全性和操作性。为开发者提供了所有基础设施,扩容到吸收用户的流量高峰以及处理用户数据的安全问题。
使用一个API服务通常可以提供更多的便利性和更高的安全性,同时也降低开发和维护的成本。开发人员可以把更多的注意力打集中在自己应用程序的独特部分。
不过有时用户也需要权衡的使用API服务。当你引用一个第三方的依赖性服务到你的应用时,这个第三方服务需要具备高可用、高速、便携性高、能提供传输过程中的高可靠性,并具有足够的灵活性,以满足你的用户数据模型。
可用性和性能是至关重要的,因为对于一个关键系统,用户认证和管理服务是不能离线或变慢的。在SDK缓存并基于现代云计算基础设施是不错的开始,但重要的是,该服务即将面临到最糟糕的情况——例如整个数据中心正在走下坡。因此你想要确保您可以收到任何的通知,则需要建立在用户管理服务的顶部。
https://stormpath.com/resources/security-and-availability/
https://status.stormpath.com/

数据迁移也很关键——你能够安全的把用户数据来回迁移。与轻松写一个脚本把未加密的数据移到JSON上不同,移植密码的难易程度严重依赖于任何已存在的数据的存储方式。例如bcrypt设计的就很容易移植,因为它遵循模块加密格式MCF(Modular Crypt Format)。对很多系统和语言而言,通过查看散列值本身来构造散列是可能的。如果你建立了一个原型,且没有使用 Stormpath之类的服务,我们推荐以bcrypt之类的MCF散列开始——在将来升级时会比较容易。
应用程序和API服务之间的传输安全也是很重要的。额外的网络通讯需要安全化。例如Stormpath 仅支持 HTTPS,使用一个自定义的摘要认证算法来确保,不会被回放和中间人攻击。关于安全性你可以在这里了解更多。https://stormpath.com/resources/security-and-availability/
授权认证服务使用的数据模型很广泛。以Salesforce为例,它的数据模型与Stormpath数据模型有很大的不同。它是基于目录的,因此更通用、更灵活。深入理解这些数据模型是很有价值的,尤其是多承租人应用或者SaaS。此外,API文档变化很大——你应该确保你在努力开始做事之前细致地了解大纲。

选择适合的Node.js授权认证策略相关推荐

  1. 选择适合的Node js授权认证策略

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 选择适合 ...

  2. Node.js基金会官方的开发者认证准备就绪

    Node.js基金会正在为新的Node.js开发者认证(Developer Certification)做最后的准备工作,该认证计划于十二月推出. \\ 新推出的认证可能将采用一种不同于开发人员习以为 ...

  3. 前端科普系列(2):Node.js 换个角度看世界,

    [前端科普系列]往期精彩内容: 前端科普系列(1):很有趣的一篇前端简史,作者有心了~主要介绍 web 前端发展的历史.大事件. 本文为系列文章(2),主要介绍 Node.js 的前世今生.核心科技以 ...

  4. 微服务架构如何设计API代理网关和OAuth2授权认证框架

    1,授权认证与微服务架构 1.1,由不同团队合作引发的授权认证问题 去年的时候,公司开发一款新产品,但人手不够,将B/S系统的Web开发外包,外包团队使用Vue.js框架,调用我们的WebAPI,但是 ...

  5. [转]为什么我要用 Node.js? 案例逐一介绍

    原文地址:http://blog.jobbole.com/53736/ 介绍 JavaScript 高涨的人气带来了很多变化,以至于如今使用其进行网络开发的形式也变得截然不同了.就如同在浏览器中一样, ...

  6. 为什么我要用 Node.js? 案例逐一介绍

    介绍 JavaScript 高涨的人气带来了很多变化,以至于如今使用其进行网络开发的形式也变得截然不同了.就如同在浏览器中一样,现在我们也可以在服务器上运行 JavaScript ,从前端跨越到后端, ...

  7. 图灵访谈系列之九:CNode社区谈Node.js技术及生态

    Node.js在各种技术会议上的分享越来越火热,为了让更多的人了解Node.js以及Node.js中文技术社区CNode,12月10日在易宝支付举行第三期Node.js北京分享会--NodeParty ...

  8. 如何调试Node.js应用程序?

    如何调试Node.js服务器应用程序? 现在,我主要使用带有以下打印语句的警报调试 : sys.puts(sys.inspect(someVariable)); 必须有更好的调试方法. 我知道Goog ...

  9. node.js入门系列(一)--Node.js简介

    什么是NodeJS JS是脚本语言,脚本语言都需要一个解析器才能运行.对于写在HTML页面里的JS,浏览器充当了解析器的角色.而对于需要独立运行的JS,NodeJS就是一个解析器. 每一种解析器都是一 ...

最新文章

  1. TSNE Understanding
  2. ACM入门之【差分】
  3. 配置Apache服务器的PHP运行环境
  4. IT部门绩效考核:一本糊涂账?
  5. 为什么搜索与推荐场景用AUC评价模型好坏?
  6. 解决Struts2的配置文件struts.xml文件无提示问题
  7. macos 判断走无线网还是有线网_“第一次约会,就想发生关系”:怎样判断男人对你走心还是走肾?...
  8. 【李宏毅2020 ML/DL】P57 Unsupervised Learning - Linear Methods | PCA Matrix Factorization
  9. 手撸 webpack4.x 配置(二)
  10. nginx学习:搭建静态资源服务器
  11. 交换机连接路由器计算机联网,交换机上连接路由器_连上路由器(交换器)后部分电脑无法上网的解决方法_交换机上接路由器...
  12. 计算机rom分类,一文看懂ROM的结构、特点及其分类-控制器/处理器-与非网
  13. 第一次参加pub的地面聚会
  14. 华为什么时候能升android10,华为手机什么时候升级安卓Q 华为首批适配Android10机型列表...
  15. 《惢客创业日记》2019.02.22(周五) 先僵化,后优化,再固化
  16. python闯关训练营怎么样3.0_泡着枸杞写bug的三流程序员凭什么逆袭到一线大厂?...
  17. 瓶子机器人diy制作大全_塑料瓶回收改造成电动机器人玩具
  18. Trinity的介绍与下载
  19. 【DDD设计】 Domain model VS DAL Entity VS Presentation DTO
  20. 【自学】C语言程序设计

热门文章

  1. Android进阶知识树——Android Handler消息机制
  2. 云计算的认识和看法_我的关于云计算的看法和认识
  3. QImage、QImageReader Qt获取图片大小
  4. 使用python封装了一个获取小程序token,发送订阅消息的类
  5. 2023复旦大学计算机考研经验分享
  6. 连小白都能看懂的微信开发之测试账号申请
  7. JVM虚拟机(JDK8)
  8. 栈展开(stack unwinding)
  9. 大数据和java的区别
  10. element-ui快速使用(使用element-ui做一个表格)