Passwordless认证:安全、简单并且快速部署

Passwordless是一个Node.js的认证中间件,可在快速简单部署的同时为你的用户提高安全性。

过去几个月对于每一个对网络安全和隐私感兴趣的人都是非常令人激动的:绝佳的文章讨论,以及演讲但也有大量引起关注的事件

然而,大多数网站仍然无法摆脱与早期网络就开始的相同的认证机制:用户名和密码。

虽然用户名和密码有它们的一席之地,但如果它们对于我们的项目来说是正确的解决方案,我们应做的更有挑战性。我们知道大多数人在所有他们访问的站点都使用相同的密码。对于没有专业安全专家的项目,我们是否真的应该让我们的用户冒着风险,违反我们的网站规定又损害他们亚马逊账号的么?同样,传统的认证机制默认存在至少两个攻击媒介:登陆页面和密码找回页面。尤其后者通常是实现的很匆忙,因此本质上更危险。

我们最近看到过相当多很棒的想法,而我则因为一个很简单明了且低技术含量的方案感到异常的兴奋:一次性密码。这实现起来很快,有较低的攻击风险,并且不需要二维码(注:QR codes)或JavaScript。无论用户何时想登陆或注销其会话,她都会收到一个短暂的一次性链接附带一个通过邮箱或短消息发送的令牌(token)。如果你想试试看,可随时测试passwordless.net上给出的例子。

不幸的是——根据你的技能堆栈——只有很少的现有解决方案。Passwordless为Node.js改变了这个现状。

开始使用Node.js和Express

开始使用Passwordless是简单明了的,你能够在两个小时内为一个小型项目部署一套完全成熟并且安全的认证方案:

获取基本框架。同样你要安装一个现有的存储接口,例如安全存储令牌的MongoStore

了给用户分发令牌,邮箱应作为作常用选项(短消息同样可行);你可以自由的选取现存的邮件框架,例如:

基本设置

我们在同一个文件中调用上诉提到的所有模块,该文件用来初始化Express:

如果你选择了emailjs用来分发令牌,那么用它连接到你的邮箱账号(例如一个Gmail账号)将会是美妙的一刻:

最后的准备工作是告诉Passwordless你选择了那种存储接口并初始化它:

分发一个令牌

passwordless.addDelivery(deliver)添加了一个新的分发机制。在任何时候一个令牌被送出就会调用deliver。默认情况下,你选择的机制会给用户提供一个如下格式的链接:

具备所有需要的详情,deliver就会被调用。因此,令牌的分发(本例中使用emailjs)可简化如下:

初始化Express中间件

sessionSupport()使得登陆持久化,因此用户在浏览你的网站是一直处于登陆状态。请确保你已经提前准备好你的会话中间件(例如express-session)。

acceptToken()将拦截任何进入的令牌,认证用户,并重定向用户到恰当的页面。虽然successRedirect选项不是严格意义上必须的,但是强烈建议使用它,以避免泄露合法令牌(通过你的网站向外发出的HTPP链接的引用头信息)。

路由 & 认证

以下操作假设你已经根据express文档中描述的,使用router = express.Router();设置好了你的路由器

你需要至少两个URL用来:

  • 展示一个询问用户邮箱的页面
  • 接收表单详情

发生了什么?passwordless.requestToken(getUserId)有两个任务:确保邮箱地址存在转换该地址为唯一的用户ID(这个ID会通过邮箱送出并在后面标识用户时使用)。通常,你会已经有一个模型用来处理存储你的用户详情并且你能与它进行简单交互,就像上面那样。

在许多场景下(试想一篇博客被多个用户编辑)你也可以跳过整个用户模型,仅仅硬绑定合法邮箱地址和他们各自的ID:

HTML页面

它所需要的仅仅是一个简单的HTML表单来获取用户的邮箱地址。Passwordless默认会寻找名称为user的输入框:

保护你的页面

Passwordless提供了中间件来确保只有授权用户能看到某些页面:

谁登陆了?

默认情况下,Passwordless让用户ID在请求对象中始终可用: req.user。想展示或重新使用这个ID来进一步从数据库获取详情,你可以这样做:

或者,更普遍的方式,你可以添加另外一个中间件从你的模型中拉取整条用户记录并且让它在你网站上任何路由都可用:

就是这样!

这就是让你的用户认证安全并且简单所需要的一切了。更多详情,可进行 深入了解,它解释了所有可选项以及向你示例如何集成上诉所有的东西做为一个工作解决方案。

评价

正如前面提到的,所有认证系统都有它们的权衡,所以你应该选择你所需要的正确的系统。基于令牌的途径与大多数其他方案有同样的风险。传统的用户名/密码方案:如果用户的邮箱账号并且/或者你的SMTP服务器和用户间的通道被盗用,那么你的网站上的用户同样也会被连累。有两个默认的选项可帮助减轻(但不是完全消除)这种风险:短时令牌和自动撤销已经被使用过的令牌。

对大多数网站基于令牌的认证加强了安全性:用户不需要考虑新密码(通常都太过简单)并且没有用户重复使用密码的风险。

另外一点是易用性。网站的首次使用和后续的登陆我们都应该考虑。对于第一次使用的用户,基于令牌的认证再简单不过了:当然他们必须的验证他们的邮箱地址正如古老的认证机制一样,但是在最好的情况下不会再要求更多的详细信息。不需要创造性的想出一个满足所有约束的密码并且没有任何需要记忆的东西。如果用户再次登陆,体验则取决于具体的使用情况。大多数网站都有相当长的回话超时时间并且登陆比较少。或者,人们访问网站如此频繁以至于他们很难回忆起他们已经拥有的账号及对应的密码可能是什么。对于这些情况,Passwordless在易用性上展示了清晰的优势。并且,有一些在过程中可以解释的非常清楚步骤。用户频繁访问的和/或人们习惯于一周登录几次的网站(想想亚马逊)可能或多或少受利于传统(或更好的:双因素身份验证 )方法,如果人们倾向于记住他们的密码,那么可能有更多的机会去说服用户关于好密码的重要性。

虽然Passwordless被认为是稳定的,但我还是希望看到你在GitHub上的评论和贡献,或者你在Twitter上的提问:@thesumofall

打赏支持我翻译更多好文章,谢谢!

打赏译者

打赏支持我翻译更多好文章,谢谢!

1 收藏 评论

关于作者:yuanzhang

#Java 开发#js 个人主页 · 我的文章 · 11 ·   

相关文章

可能感兴趣的话题



直接登录
跳到底部
返回顶部