【问题标题】:Authenticate multiple Rails servers against Devise authentication针对 Devise 身份验证对多个 Rails 服务器进行身份验证
【发布时间】:2018-12-03 23:02:11
【问题描述】:

我们有一个单一的 Rails 3 (Ruby 1.9) 服务器,它为我们完成一切,包括设计会话身份验证。

我们最近决定引入一个新的 Rails 5 服务器(从头开始构建),它将作为 API 服务器并慢慢取代旧服务器中的现有功能。

我们的问题是会话身份验证发生在旧的 Rails 服务器上,我们希望在新的 Rails 5 服务器中包含会话身份验证。

是否有人对如何使用新的 Rails 服务器对具有会话信息的现有 Rails 服务器进行会话身份验证有经验或建议?

不用说,我主要关注前端开发 - 服务器端身份验证不是我的强项。

【问题讨论】:

  • 我假设它们在同一个数据库上工作,您的 rails 5 应用程序是否具有相同的设计逻辑设置?您的两个选择是在您的 rails 5 应用程序中复制登录逻辑,或者从那里向您的 rails 3 提交请求,我想这会破坏目的。
  • 我们担心更改身份验证会为本次冲刺带来太多风险。我们可以在 Rails5 的 application_controller 中使用一个方法来查询 Rails3 并接收 current_user 和相关会话数据作为响应吗?
  • 你可以,设置一个返回当前用户 ID 的新端点非常简单(如果你担心安全性,可能还有一个关联的令牌)。不过,这仍然会在您的旧服务器上进行实际身份验证,他们需要登录才能返回该数据
  • 您真的想在 API 服务器上使用基于会话的身份验证吗?
  • @max 我的其他选择是什么?我希望能够在 API 服务器中使用通用方法来呈现与当前登录用户严格关联的行的结果

标签: ruby-on-rails ruby devise


【解决方案1】:

您可以有多个 Rails 应用程序共享同一个数据库并使用 Device 对用户进行身份验证。但是您需要确保在加密密码时使用相同的输入/算法。

对于 Devise,这已默认为 BCrypt 已有一段时间了,您还需要确保两个应用程序的 config.stretches 设置匹配。多年来,实施已经发生了一些变化,您的里程可能会有所不同。

这里的关键概念是您不是针对应用程序进行身份验证 - 您是在验证用户提供的密码加密结果与数据库中的摘要匹配。

但您还应该首先认识到这些应用可能根本没有相同的身份验证要求。大多数 API(至少是好的 API)都使用基于令牌的无状态身份验证。

基于会话的身份验证的一个主要问题是 cookie 通常在单个域或子域上工作,如果它们在跨域(第三方 cookie)工作时通常会被浏览器禁用,这意味着如果您的 api 和旧版应用程序不在同一个子域上。 Cookie 也是仅在浏览器中可用的功能,而基于令牌的身份验证适用于任何类型的客户端。

虽然您可以让新应用程序通过 HTTP 查询旧应用程序,但修改这实际上可能是浪费时间,因为无论如何新应用程序都需要自己的身份验证解决方案。

有多个 gem 为 Devise 提供基于令牌的身份验证。

【讨论】:

  • 我会探索这个选项并把我的发现发回,谢谢!
猜你喜欢
  • 1970-01-01
  • 2016-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-29
  • 1970-01-01
  • 1970-01-01
  • 2020-02-19
相关资源
最近更新 更多