在Rails应用程序中如何以及为什么要实现OAuth?

4

我正在创建一个应用程序,除了一些远程触摸屏幕外,它实际上只与另一个Rails应用程序通信。该应用程序仅对拥有这些触摸屏幕和管理员权限的个人可用。因此,我真的不认为有必要使用Twitter、Facebook等进行登录。但是,我需要某种类型的HTTP身份验证,使用请求/访问令牌来1.验证用户并2.能够推断出哪个用户正在与服务器通信(以及何时)。我已经花费了大约一周的时间(我是一个Rails新手),研究了Oauth、Omniauth等内容,并提出了以下两个问题:

  1. 由于我在自己的两组应用程序之间进行身份验证,因此对于我的情况,哪个gem最好?

  2. 我应该在哪里编写请求/访问令牌的逻辑?

我真的找不到任何好的教程。

1个回答

13
如果您不需要与现有身份提供者集成,那么Devise就是你所需要的。它为您提供了一种简单的方式来管理用户帐户,用户将使用其电子邮件地址和密码登录。
如果要对另一个应用程序进行身份验证,则会变得更加棘手。
方法1:
如果两个应用程序之间的通信不多,您可以让用户登录到主应用程序,然后生成一个临时令牌,用户可以在辅助应用程序中使用该令牌。最后,在主应用程序的所有通信中都包含此字符串。现实世界的例子包括Pivotal Tracker,它为用户提供可以在GitHub上的Web挂钩中使用的API密钥。
琐碎的例子:
1. 用户转到Main.com并使用电子邮件和密码登录。 2. Main.com为用户生成一个临时令牌。 3. 用户将令牌提供给Sub.com。 4. Sub.com使用<user>:<token>@main.com/some/path?some=query联系Main.com。
这有很多安全问题,但对于非关键用例来说已经足够了。您可能希望使用SSL来保护令牌。
方法2:
但是,方法1并不是非常安全。更健壮和安全的解决方案是使主应用程序成为OAuth提供程序,然后使辅助应用程序使用OAuth对主应用程序进行身份验证。这里有一个Railscast解释了如何使用DoorKeeper实现此目的。您可以在辅助应用程序中使用OmniAuth。

我采纳了您关于第二种方法的建议,现在我已经成功地安装并配置了devise、oauth2和doorkeeper。请问如何在以下两种情况下提取用户ID:1. 用户登录时;2. 用户请求访问其他资源时? - LongForde
1
我认为 RailsCast 链接已经失效了,现在你必须支付 10 美元才能观看。这就是为什么我们现在喜欢在回答中包含所有相关信息,而不仅仅提供一个源或进一步阅读的链接。 - anon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接