如何在我的 rails API 中有效地使用 Devise 和 Doorkeeper?

Posted

技术标签:

【中文标题】如何在我的 rails API 中有效地使用 Devise 和 Doorkeeper?【英文标题】:How do I effectively use Devise and Doorkeeper in my rails API ? 【发布时间】:2016-05-03 19:24:45 【问题描述】:

我很难理解流行的 Doorkeeper 和 Devise gem 的职责和能力。我在授权和身份验证方面没有过多的经验,所以如果我误解了这些领域的某些方面,请原谅我。我确实很努力,如果我做某事,我想以正确的方式去做,所以这是我目前的情况:

我想构建一个仅 API 的 rails 应用程序,该应用程序负责在用户注册和使用服务时对其进行身份验证和授权。我精心挑选了两个相当流行的宝石,称为 Doorkeeper(授权)和 Devise(身份验证)。

我目前有这个结构并且它有效,但是,我在完全理解这些宝石的职责时遇到了问题。据我了解,Devise gem 用作身份验证层,这意味着可以识别和登录用户(其他功能将在下面讨论)。另一方面,Doorkeeper 将确保资源只能由有权访问的成员访问。我选择 Doorkeeper 进行 OAuth2 集成是因为我的服务器需要能够在未来将 API 访问权限授予潜在的第三方。

我的首要问题是我对这些宝石的假设是否正确。

这是当前的身份验证/授权流程:

问题:用户注册,如果我的 API 没有 Devise 提供的预配置视图,我如何利用 Devise 发送确认电子邮件? (旁注:可恢复、可记忆、可跟踪和可确认的特征在用户模型/迁移中。)

同样,我很想知道如何实现潜在的密码重置。请注意,只要它们适用于我的用例,对示例的引用就足够了。

我知道 Devise 提供了这些功能,但是如果不触及他们预先配置的(查看?)路线,就很难弄清楚如何做到这一点。

例如,当一个用户注册时,他点击了我自己的user_controller 的创建方法,它基本上只是创建一个新用户,它应该自动发送确认电子邮件(如果我们假设我的邮件配置是正确)?

我不完全确定避免使用预先配置的路线是否有意义,这就是为什么我想听听更有经验的人在过去可能使用过这些宝石,如果我的想法是正确的或者我是否是完全关闭这个。

【问题讨论】:

github.com/doorkeeper-gem/doorkeeper/wiki/example-applications JWT 的魔法是一种选择吗?看这个例子:tangosource.com/blog/…. 已经4年多了。你可能有所有的答案和更多。这正是我想要做的。你能发布你最终做了什么吗?如果我需要做一些不同的事情,因为我们在遥远的未来? 【参考方案1】:

Devise 真的可以为你做所有事情,如果你绕过自动机制并想手动重新实现它们......你会犯错。 不要绕过控制器机制并使用设计的 wiki 进行小的自定义,例如在创建/更新后更改重定向。

Devise 为您处理确认电子邮件(可确认)和密码重置(可恢复)系统,因此请使用他们的系统,这只是激活选项。

如果你想改变他们的观点(我们总是想自定义布局)你可以:

rails g devise:views

它将通过您的自定义视图保持设计流程。

如果您想停止使用特定机制,只需将其从模型中删除即可。

devise :database_authenticatable, :registerable, :confirmable, :recoverable

如果根本不使用预配置的路由(意味着删除选项并在路由中使用 except),那么避免使用它们是有意义的,但正如您想要的所有机制,Devise 提供的所有机制在这里都没有意义。

他们的 Wiki 非常密集,但一遍又一遍地阅读,您需要的一切都在这里。

终于: 是的,Gatekeeper 提供了一个很好的 OAuth2 提供程序系统,并且与 Devise 很好地混合在一起,所以你在这里做出了一个不错的选择。他们的视图系统也是可定制的。

您可能还想查看为您的用户(简单、API、管理员等)处理角色和权限的 cancancan。

希望对你有帮助!

【讨论】:

我知道这个答案已经有几年的历史了,而且这个问题甚至更老了,但是我带着与原始海报完全相同的问题来到 SO,这个答案还不够。当您处理仅 API 的 Rails 应用程序时,管理密码流需要 Devise 的内置视图(或其改编版本)以外的其他东西。

以上是关于如何在我的 rails API 中有效地使用 Devise 和 Doorkeeper?的主要内容,如果未能解决你的问题,请参考以下文章

不确定关联是不是在我的 rails 应用程序中有效

如何在我的 Gatsby 博客网站中有效地显示 GIF 图像?

Rails 如何在使用外部 API 创建时保存数据?

rails: 如何基于子域覆盖locale?

如何测试Controller post:使用rspec在rails上创建JSON api?

通过 ASP.NET Web API 有效地使用 async/await