node.js 中的登录策略

Login Strategy in node.js

我在一个有社交登录(Facebook 和 G+)的项目中工作。当用户在社交网络上创建他的帐户时,我会存储联系电子邮件,但不会存储密码。如果用户想使用本地帐户,他必须恢复密码。这是一个好策略 o 我必须创建一个随机密码并通过电子邮件提供给用户吗?

谢谢!

我见过两种方式:

  1. 使用外部登录在
  2. 之间迁移用户数据
  3. 使用外部身份验证来实际执行身份验证(更安全)

对于 1),您必须让用户创建自己的密码。不要忘记这是一个不平凡的 activity (salt your hashes, use bcrypt)

万一用户忘记密码,有几种方法可以实现安全系统,但一个足够简单的方法是创建一些 nonce 并通过电子邮件将 link 发送给用户使用 nonce 作为访问 url,这应该是不可猜测的:

即:将登录后的电子邮件发送至 http://website.com/user/forgot/421c76d77563afa1914846b010bd164f395bd34c2102e5e99e0cb9cf173c1d87

从不 向用户发送密码。 你甚至不应该,它应该是单向散列且不可检索的。使用它的唯一方法是与新登录尝试的哈希值进行比较。

关于 2) 查看使用 Passport 或类似的预构建模块与 OAuth2 集成。如果您在外部进行身份验证,我认为您不需要存储任何密码。这是一个好的开始选项。

我要加入并提出一些与 David 略有不同的建议(顺便说一句,他的回答很棒)。

注意:我有点偏见,因为我推荐的库是我写的那个:express-stormpath.

基本上,只要你想支持用户的多次登录,你就有多种选择。其中一些归结为您希望为用户提供的用户体验体验的选择。

例如:你想强制用户创建一个传统的带有电子邮件/密码的帐户,然后有选择地让他们link他们的Facebook / Google 帐户?或者您想做一些更自定义的事情?

我在用 Passport.js 做上述事情时遇到的一个问题是你必须使用多种策略,这有时会导致问题:你必须自己做很多手工工作,这需要很多时间/试验/错误。

相反,对于像上面这样的更复杂的情况,我喜欢使用 express-stormpath 东西。

这是一个代码示例,它提供了一个注册页面,以及一个带有 Google / Facebook / 电子邮件帐户注册和验证的登录页面。它通过使用您的社交凭证并生成适当的按钮/后端代码来处理所有 OAuth 协商 100%:

var express = require('express');
var stormpath = require('express-stormpath');

var app = express();

app.use(stormpath.init(app, {
  enableFacebook: true,
  enableGoogle: true,
  social: {
    facebook: {
      appId: 'xxx',
      appSecret: 'xxx'
    },
    google: {
      clientId: 'xxx',
      clientSecret: 'xxx'
    }
  }
});

app.listen(3000);

以上是一个完整的工作项目。如果您访问 /register,系统会提示您创建一个帐户。

如果您访问 /login,系统会提示您登录一个帐户(使用 email/password、facebook 或 google)。

简单吧?

如果您想了解更多有关如何使用 express-stormpath 设置 Facebook/Google 登录的信息,您可以在此处找到信息:

祝你项目顺利。