Rails 4设计Omniauth,将多个提供者绑定到与用户关联的模型

时间:2015-09-24 19:32:28

标签: ruby-on-rails devise omniauth

我有一个关于如何处理集成设计的问题。我有两个模型CompanyUser。在我的情况下,用户将注册我的应用程序,然后呈现选项将应用程序连接到他们的不同帐户(Twitter,Facebook和LinkedIn),以便他们可以查看/创建帖子/推文/等。由于Company has_many Users和社交媒体帐户属于公司,因此我希望使用另一个名为Company的模型将凭据绑定到Provider模型存储凭据,因此允许任何有权访问公司社交媒体帐户的用户。

我一直在关注如何配置多个omniauth提供程序的各种教程,但它们都专注于将它们绑定到用户模型并告诉我将devise :omniauthable添加到我的用户模型。

如何使用Company omniauthable而不是用户?如果我不打算允许用户身份验证/注册视图omniauth,我是否甚至需要使我的模型具有可扩展性?

这是我第一次构建社交媒体集成,所以我希望我的问题有道理。谢谢!

2 个答案:

答案 0 :(得分:2)

我有类似的工作。我们有一个应用程序,允许使用omniauth和devise允许从FB,LI和Twitter进行oauth识别。我将Devise和Omniauth与User模型绑定,并拥有一个具有provider字段,uuid和user_id关系的Identity模型。这种方式使用从提供者或活动会话返回的电子邮件,我可以确定用户是否已经存在于系统中并相应地链接身份。使用Twitter有点棘手,因为他们不会返回电子邮件,因此您必须添加以确定用户是否拥有经过验证的电子邮件,如果不是,则需要提示他们。你可以通过使公司模型omniauthable和devise_authentcatable做同样的事情,但它似乎有点违反直觉。我使用标准用户方法并让用户拥有一个或多个公司。希望这会有所帮助。

答案 1 :(得分:0)

经过深思熟虑后,我想出了一种效果很好的方法,并且比我最初尝试的方法简单得多。这看起来像是一个黑客,所以我当然愿意看看是否有人采取更清洁的方法。

我做的第一件事就是放弃使公司模式无可比拟,因为我不希望用户以公司身份登录,而是以公司用户身份登录。相反,我将用户模型设为omniauthable,然后创建了Identity模型,belongs_to用户和公司。 UserCompany has_one Identity。用户授权提供者后,将创建新身份。

由于用户和公司都拥有该身份,因此belong_to公司可以通过该公司访问该身份的其他用户。同样,如果用户登录并且没有任何身份,系统将在允许他们添加身份之前检查他们的公司是否具有任何身份。这样,每个公司每个提供商只有一个身份,并且哪个用户创建它并不重要。