什么是omniauth和电子邮件密码注册的最佳做法?

问题描述:

将Facebook登录(假设我将使用Omniauth gem)和电子邮件+密码登录的最佳做法是什么?什么是omniauth和电子邮件密码注册的最佳做法?

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

子问题:

我正在考虑创建电子邮件+从头密码注册(不使用这方面的任何宝石,让我们保持它的快,重量轻),所以你有这方面的任何建议吗?或者如果你有特别的宝石,请让它快速。

您是否有任何其他建议Oauth2宝石(替代Omniauth)处理验证到Facebook?

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

+0

是否有你不希望使用设计的一个原因? – Solomon

+0

根据我的经验,如果你在一个项目中有太多的宝石,项目开始放慢速度,但更具体地说,我不是行动的设计太重了,但我正在寻找更简单的功能更轻的宝石我需要 – equivalent8

这是我看到它在大多数例子,当你用电子邮件+密码,要创建行直接向用户模式(不接触AUTHENT立即登记完成在网络上

auth_with_devise_and_ominauth

basicly 。模型)以及在使用Omniauth注册时,比创建与用户模型通信的新身份验证更有用。

而且basicly在下次登录时,你正在做的事情是这样的:

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

所以你2种型号之间swiching和强奸(有关术语抱歉)用户模型女巫应该持有用户信息

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

enter image description here

正如你所看到的,甚至用户+密码正在通过Authentic。模型,这意味着该网站用户+密码作为自身

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

  • 场景1

签约供应商用FB:将FB uid和authKey保存到认证表中,然后创建用户

  • 方案2

签署了密码:你AppPass表中创建新行,然后你在认证表中创建行(作为供应商巫婆访问实际上是你的应用程序)和比你创建用户

为什么?

因为现在当用户登录时,始终会通过Authentic。模型,没有使条件之间2模型(验证和用户模型)

现在任何人都可以请告诉我,...这是一个好方法:D?

+1

这是对Intridea用OmniAuth身份所做的很好的描述。 – sizzle

+1

我完全同意你的看法。我得出了完全相同的结论,并认为我会搜索互联网,看看我是孤身一人,还是认为共识有争议......实际上,omi-identity的自述文件中的一行代表了同样的事实:“身份模型应该与您的用户模型相关联,为您提供最大的灵活性,以包含其他身份验证策略“ – charlysisto

+0

几年前,我曾经写过这篇Q/A,当时我是一位经验不足的开发人员,我仍然同意答案,我很高兴其他人也有同样的观点在它:) – equivalent8

Omniauth是很大的,所以你应该使用对于任何/所有社交媒体登录。

至于设置自己的身份验证,这应该不会太难。 Ryan Bates对此有一个很好的截屏:Authentication from scratch

这是一篇不错的omniauth文章(你将不得不适应它到你自己的用户表,但它仍然是一个很好的资源)Omniauth rails rumble。请注意,我认为这篇文章的作者在这里使用了错误背景下的授权这个术语。 Omniauth与授权无关,只有身份验证,这是一个微妙但非常重要的区别。

+0

thanx来回答,但这不是我要找的。我以前都在写这两篇文章,但他们谈论的是两件不同的事情,而不是如何将这两种方法结合起来(这意味着通过oauth身份验证来创建身份验证+密码注册)。我会在下一个答案中更深入地解释自己... – equivalent8

+0

没问题。我过去处理此事的方式是从头开始创建认证(带有password_hash,电子邮件等的用户模型),然后每个用户拥有多个认证。使用此功能,用户可以同时拥有登录/密码和登录第三方登录。 – Msencenb

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

我不认为你是正确的,有不同的认证方法去不同的表格会放在模型上太多的压力(也许是一个更好的术语)。

在我看来,如果每个人都在使用设计,这是有原因的。你可以通过写一些自己缩小的东西来获得更好的表现,但这是一个很大的时间投入。我的猜测是,应用程序中性能的小幅提升并不值得你花时间写点东西。

如果您正在开发一个当前项目,其中有成千上万的并发用户难以扩展,请忽略我的建议,因为我不熟悉这些类型的问题。

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

问题是,我试图结合我的身份验证功能与网站登录/注册功能,女巫是两种不同的行为。在使用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 

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

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

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

+0

有一个单独的表的关键好处是允许多个提供商。 您可以简单地将provider和uid存储在认证表中,并将其他所有内容存储在用户表中。 这并不是那么丑陋。您只需通过当前用户构建身份验证,然后保存该用户。使用oauth的整个概念和实践,连接必要的部分,以及处理各种登录/注销以及先前已认证或不认证的情况都是一个更大的难题。 – ahnbizcad

Intridea提供电子邮件&口令策略,启用此: https://github.com/intridea/omniauth-identity

:-)