在node.js中login策略

我正在一个有社交login(Facebook和G +)的项目中工作。 当用户使用社交networking创build自己的帐户时,我会存储联系人电子邮件,而不是密码。 如果用户想要使用本地帐户,他必须恢复密码。 这是一个很好的策略吗?我必须创build一个随机的密码,并通过电子邮件给用户?

谢谢!

我已经看到它做了两种方式:

  1. 使用外部login来迁移用户数据
  2. 使用外部authentication来实际执行authentication(更安全)

对于1),你将不得不让用户创build自己的密码。 不要忘记这是一个不平凡的活动( 盐你的哈希 ,使用bcrypt )

在用户忘记密码的情况下,有一些方法可以实现一个安全的系统,但是一个足够简单的方法是创build一些随机数并通过电子邮件向用户发送一个链接,将其作为一个访问url,这个访问url应该是不可猜测的:

即:发送电子邮件loginhttp://website.com/user/forgot/421c76d77563afa1914846b010bd164f395bd34c2102e5e99e0cb9cf173c1d87

永远不要发送用户的密码。 你甚至不应该能够 ,它应该是单向散列和无法检索的。 它使用的唯一方法是比较一个新的login尝试的散列。

关于2)查看使用Passport或类似的预build模块与OAuth2集成。 我不认为应该是这样的情况下,如果您要进行外部身份validation,则需要存储任何密码。 这是一个很好的开始选项。

我会跳进来,并提出一些build议稍微不同于大卫(顺便说一句,答案是伟大的)。

注意 :我有点偏见,因为我推荐的图书馆是我写的: express-stormpath 。

基本上,只要你想支持多个login用户,你有不同的select。 其中一部分归结为您想为用户提供的UX体验select。

例如:你想强制用户创build一个电子邮件/密码的传统帐户,然后让他们有select地链接他们的Facebook /谷歌帐户? 或者你想做一些更自定义的东西?

我之前用Passport.js做了上面这些事情的其中一个问题就是你必须使用多种策略,这有时会引起一些问题:你必须自己做大量的手工工作,这需要花费很多时间/试用/错误。

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

这是一个提供注册页面的代码示例,以及一个包含Google / Facebook /电子邮件帐户注册和validation的login页面。 它通过使用您的社交凭证,并生成适当的button/后端代码来处理所有的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); 

以上是一个完整的工作项目。 如果您访问/注册,系统将提示您创build一个帐户。

如果你访问/login,你会被提示login到一个帐户(电子邮件/密码,Facebook或谷歌)。

容易吗?

如果您想了解更多有关如何设置Facebook / Googlelogin表单的信息,可以在这里find相关信息:

  • Facebook指南: https : //docs.stormpath.com/nodejs/express/product.html#use-facebook-login
  • Google指南: https : //docs.stormpath.com/nodejs/express/product.html#use-google-login
  • 正常的快速启动文档: https : //docs.stormpath.com/nodejs/express/setup.html

祝你的项目好运。