ruby-on-rails - 跨应用程序/服务器的 Rails 身份验证

标签 ruby-on-rails ruby authentication oauth single-sign-on

我一直在开发我的 Rails 应用程序,同时尽可能保持它们模块化。我正在尝试将下面的不同部分实现为服务。

举个Facebook的例子:
a) MainApp 允许用户拥有墙、帖子等。
b) 存储照片的 PhotoApp,允许用户查看他的照片等。这是一个独立的应用程序,将有一个 REST API,MainApp 也可以使用它。

我正在考虑使用 OAuth 作为单点登录解决方案(如本教程中的 http://blog.joshsoftware.com/2010/12/16/multiple-applications-with-devise-omniauth-and-single-sign-on/ ),其中每个应用程序都将通过 OAuth 获得授权,并将根据 cookie 访问当前用户 session 。

第一个问题:这是一个可行的解决方案吗?

第二个问题:我希望能够从 MainApp 服务器调用 PhotoApp API(不是来自用户的浏览器)。在这种情况下身份验证将如何工作?

第三个​​问题:如果说我有一个使用 node.js 的服务,这将如何工作?

最佳答案

是的,使用 OAuth 的 SSO 是一种可行的解决方案,但它并不是最简单的解决方案。在 build 任何新东西时,OAuth 2.0是要走的路。 OAuth 标准涵盖了很多领域。

OAuth 的主要优点是它允许用户授予第三方应用访问其帐户的权限,而无需向第三方透露其密码。如果您没有认真地提供这种互操作性,那么 OAuth 可能就有点矫枉过正了。

鉴于复杂性,我提供了一对不同的解决方案:

单点登录

诀窍是在域内的主机之间共享 session ID cookie 并使用共享 session 存储(如 ActiveRecordStore 或基于缓存的存储。)

每个 Rails 应用程序都有一个用于签署 cookie 的“ secret ”。在较新的 Rails 应用程序中,它位于 /config/initializers/secret_token.rb 中。在每个应用程序中设置相同的 secret token 。

然后,配置 session 以允许从所有子域访问:

AppName::Application.config.session_store :active_record_store, :key => '_app_name_session', :domain => :all

用于内部 API 调用

使用良好的共享 key 通过 HTTPS 连接进行身份验证。在“授权” header 值中传递 secret 。

您可以轻松地将共享 key 用于其他架构(如 node.js)。只需确保始终使用 HTTPS,否则共享 secret 可能会在网络上被嗅探。

关于ruby-on-rails - 跨应用程序/服务器的 Rails 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10215831/

相关文章:

ruby-on-rails - ruby 1.9.2 中与 ruby​​ 1.8.7 不同的时间格式导致问题

ruby-on-rails - 使用 Shrine 在文件夹之间移动 AWS S3 Bucket 上的文件

ruby-on-rails - Rails 3.2 active_record/mass_assignment_sanitizer 未定义方法错误

ruby-on-rails - 如何在 Heroku 上的自定义域上使用 HTTPS?

ruby - 使用 Ruby Sinatra 显示 .txt 文件

iOS:拥有具有 Firebase 授权的用户名

html - $window.location.href 在 AngularJS 中不工作

ruby-on-rails - devise_token_auth 始终返回 401 未经授权

ruby-on-rails - 要扩展 Rails 的 `link_to` ,我应该使用 `alias_method_chain` 还是混合 + 继承?

.net - 更改运行 Windows 窗体程序的用户