什么是omniauth&电子邮件密码注册最佳实践?

时间:2011-08-30 17:16:11

标签: ruby-on-rails ruby devise authlogic omniauth

组合Facebook登录(让我说我会使用Omniauth gem)和电子邮件+密码登录的最佳做法是什么?

我看了几个博客,看过Railscasts,我知道每个人都在使用与Omniauth的Devise gem。但我正在寻找一些不同的观点。

子问题:

我正在考虑从头开始创建电子邮件+密码注册(不使用任何宝石,让它保持快速和轻便)所以你有什么建议吗?或者,如果你有特定的宝石,请快速。

对于处理Facebook身份验证的Oauth2 gems(替代Omniauth),您还有其他建议吗?

对不起,我在这里问这个基本问题,但我没有找到很多答案(我发现其中大多数是基于Devise的)

5 个答案:

答案 0 :(得分:6)

这就是我在网上的大多数示例中看到的内容

auth_with_devise_and_ominauth

基本上,当您使用电子邮件+密码注册时,您将直接创建行到用户模型(不接触验证模型),并在注册Omniauth时,而不是创建与用户模型通信的新身份验证。

基本上在下次登录时你会做这样的事情:

 if (user.password == 'xxx')
    login
 elsif user.authentication.uid == 'xxx'
    login
 else
    'hello signup !'
 end

所以你在2个模型之间进行切换,并强奸(抱歉这个术语)用户模型女巫应该只持有用户信息

解决方案,在某种程度上,我认为是正确的(根据我的经验和与同事的讨论,但我仍然不能100%确定这是正确的答案)

enter image description here

正如您所看到的,甚至用户+密码也将通过Authent。 model,这意味着站点用户+密码本身就是一个提供者

所以要绝对正确它应该是这样的 enter image description here

  • 方案1

使用FB注册:将FB uid和authKey保存到身份验证表,然后创建用户

  • 方案2

使用密码注册:您在AppPass表中创建新行,然后在身份验证表中创建行(作为访问提供商女巫实际上是您的应用)并且您创建用户

<强>为什么吗

因为现在当用户登录时,总是要通过Authent。模型,不在两个模型之间制作条件(认证和用户模型)

现在有人可以告诉我,......这是一个很好的方法:D?

答案 1 :(得分:3)

Intridea提供电子邮件和密码策略启用此功能: https://github.com/intridea/omniauth-identity

: - )

答案 2 :(得分:1)

Omniauth很棒,所以您应该将其用于任何/所有社交媒体登录。

就设置自己的身份验证而言,这不应该太难。 Ryan Bates有一个很棒的截屏视频:Authentication from scratch

这是一篇非常好的omniauth文章(你必须将它改编为你自己的用户表,但它仍然是一个很好的资源)Omniauth rails rumble。请注意,我认为文章作者在此处使用了错误上下文中的授权一词。 Omniauth与授权无关,只与身份验证有关,这是一个微妙但非常重要的区别。

答案 3 :(得分:0)

以下是最受欢迎的身份验证宝石的ruby工具箱页面的链接:http://ruby-toolbox.com/categories/rails_authentication.html。您可能无法使用任何解决方案立即找到您正在寻找的确切功能。

我不认为你在不同的表格中使用不同的身份验证方法会对模型造成太大的压力(可能是一个更好的术语)。

在我看来,如果每个人都在使用设计这样做,那就有理由。通过自己编写一些缩小的东西,你可能会获得更好的表现,但这是一项重要的投资。我的猜测是,在你自己写一些东西的时候,你的应用程序中的小的性能提升是不值得的。

如果您正在处理当前项目,其中有数千名并发用户在扩展时遇到困难,请忽略我的建议,因为我不熟悉这些类型的问题。

答案 4 :(得分:0)

我有点深入研究这些有问题的问题,我自己做了一些研究,这些都是结论。

问题是我正在尝试将我的身份验证功能与站点登录/注册功能结合起来,这是两种不同的行为。在使用omniauth的FB注册结束时,您将在身份验证表中拥有facebook uid,这就是下次返回FB所需的全部内容(当然您可以存储其他信息(如电子邮件)...但从逻辑上讲,它们是更多的用户属性,应该转到用户表。)

note: its ok to  store user information from provider, in Authentication table,
but if you want to work with them you should  copy these informations to Users table

当您注册电子邮件/密码解决方案时,您正在编写在您的网站上定义用户的信息。 (身份验证仅指向用户)如果我们想通过身份验证表进行密码注册,我们必须存储用户名&amp;身份验证表中的密码,这种方式将用户模型和身份验证合并到一个模型。这将是更加丑陋的解决方案,而不是讨论如何将多行存储到一个用户的问题。此外,您的身份验证或Oauth是“通过其他网站访问您的应用程序”的同义词(观看这些oauth2视频,如果您无法想象它http://www.youtube.com/view_play_list?p ... 0139F609),但正常登录时您将直接访问该网站。

解决这个问题的唯一方法是制作一个小应用程序,它将处理电子邮件/密码或用户/密码注册,生成密码提供程序UID,并将这些数据写入Users表,而不是我们的主要应用程序,我们将请求通过omniauth访问miniapp并将UID存储在身份验证表中。

http://eq8scrapbook.heroku.com/equivalents_article/on_omniauth_and_password_login_best_practice