跨应用/服务器的Rails身份验证

Rai*_*00B 29 ruby authentication ruby-on-rails oauth single-sign-on

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

说的Facebook的例子:
a)一个MainApp,允许用户有一个墙,柱等
b)一个PhotoApp存储的照片,使用户可以看到他的照片,等等,这是一个独立的应用程序,将有一个也可以由MainApp使用的REST API.

我正在考虑将OAuth用作单点登录解决方案(如本教程中所述http://blog.joshsoftware.com/2010/12/16/multiple-applications-with-devise-omniauth-and-single-sign-on /)每个应用程序将通过OAuth授权,并将基于cookie访问当前用户会话.

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

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

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

Mar*_*ars 20

是的,使用OAuth的SSO是一个可行的解决方案,但它并不是最简单的解决方案.在构建任何新东西时,OAuth 2.0都是可行的方法.OAuth标准涵盖了很多方面.

OAuth的主要优势在于,它允许用户在不向第三方透露密码的情况下授予第三方应用访问其帐户的权限.如果您没有认真提供这种互操作性,那么OAuth可能有点过分.

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

单点登录

诀窍是在域中的主机之间共享会话ID cookie并使用共享会话存储(如ActiveRecordStore或基于缓存的存储).

每个Rails应用程序都有一个用于签名cookie的"秘密".在较新的Rails应用程序中,它位于/config/initializers/secret_token.rb.在每个应用程序中设置相同的秘密令牌.

然后,配置会话以允许从所有子域进行访问:

AppName::Application.config.session_store :active_record_store, :key => '_app_name_session', :domain => :all
Run Code Online (Sandbox Code Playgroud)

对于内部API调用

使用良好的共享密钥通过HTTPS连接进行身份验证.在"授权"标头值中传递密码.

您可以轻松地将共享密钥与其他体系结构(如node.js)一起使用.只需确保您始终使用HTTPS,否则可能会在网络上嗅探共享密钥.


Geo*_*rge 5

您可以查看 Octolabs 的 Jeremy Green 在 2014 年 RailsConf 期间提出的面向服务的架构解决方案。

包含所有资源(存储库、演示等)的博客文章位于此处: http: //www.octolabs.com/so-auth

解释一切的视频在这里:http://www.youtube.com/watch ?v=L1B_HpCW8bs

这种集中式 SSO 并不是一项简单的任务,但 Jeremy 在谈论面向服务的架构方面做得非常出色,并准确地分享了如何将该系统组合在一起。