【问题标题】:Authentication and authorization for distributed system分布式系统的认证和授权
【发布时间】:2016-02-17 07:08:36
【问题描述】:

我正在研究分布式系统的架构,主要是 ruby​​(rails、sinatra 等)。

我有几个纯 API 组件,比如 API_C1、API_C2、API_C3。它有几个 Web 客户端应用程序,比如 Portal1、Portal2 和一些本地客户端应用程序,比如 Native1。

要求:

  1. 适用于所有 Web 客户端(Portal1、Portal2)的 SSO,集中式身份验证。
  2. 所有 API 组件都应通过授权公开其 API。
  3. 集中式 API 授权。

我做了几个 POC 来尝试一些选项,但仍然没有完整的画面。

我尝试了用于 SSO 的 ruby​​cas 服务器。它工作得很好。如有必要,我考虑使用 java cas 实现。

集中式 API 授权对我来说相当棘手。我倾向于采用 OAuth2 方式,但有一些问题:

  1. 是否可以让集中式 OAuth 提供程序为所有 API 组件提供服务?那么它应该如何工作以及使用哪些库/宝石?
  2. 如何让我的 Web 应用程序(Portal1 和 Portal2)默认受信任。我不希望用户授权访问受信任的应用程序。
  3. 对于本机客户端应用程序(非 Web 环境),我想支持 2 腿 OAuth。是正确的选择吗? 3条腿和2条腿可以同时工作吗?

  4. 如何将用户凭据转换为 oauth 令牌?假设以下用例:

    • 用户登录到 Portal1(通过 CAS 服务器)并打开一些页面
    • Portal1 后端服务器应从 API_C1 和 API_C2 中提取数据以显示页面。这里如何授权 API?

我有一些想法,比如在同一个 SSO CAS 会话下拥有 API 组件。这有点允许我的场景 4) 解决,这里没有代码。但是对 API 使用 session 是一种不好的做法,那么如何将 session 和 API 的 OAuth 授权混合在一起呢?

请指出正确的方向。是否有其他选项可以做所有事情,例如自定义 OpenId 或 OAuth 提供程序以支持 SSO?

【问题讨论】:

    标签: ruby-on-rails authentication oauth authorization cas


    【解决方案1】:

    虽然这是一个老问题(2 年前),但是我会在这里留下一个答案,以防有人试图解决类似的问题。


    我认为您考虑使用 OAUTH 的方向是正确的,但是我建议您使用 version 2.0 of the OAUTH protocol

    集中授权

    是否可以让集中式 OAuth 提供程序为所有 API 组件提供服务?那么它应该如何工作以及使用哪些库/宝石?

    • OAUTH 2.0 通过让授权服务作为独立系统/服务运行来允许这种情况,系统中的其他服务可以信任该服务并知道如何验证其颁发的令牌(通过使用其例如 x.509 证书公钥)

    • 您甚至可以使用基于 SaaS 的授权服务器而无需任何设置成本,例如 Auth0

    网络客户端

    如何使我的 Web 应用程序(Portal1 和 Portal2)默认受信任。我不希望用户授权访问受信任的应用程序。

    原生应用

    对于本机客户端应用程序(非 Web 环境),我想支持 2 腿 OAuth。是正确的选择吗?

    • 在 OAuth 2.0 中,在这种情况下使用 client credentials grant,其中可以存储 client_idclient_secret 并将它们发送到授权服务器以作为受信任的客户端进行身份验证(不需要用户凭据)

    混合在一起

    3条腿和2条腿可以同时工作吗?

    • 上述所有 OAuth 2.0 授权类型都可以在同一个授权服务/服务器上协同工作(据我所知。我实际上已经将它与 Microsoft OWIN 用于 ASP.net

    如何将用户凭据转换为 oauth 令牌?假设以下用例:

    • 授权服务具有客户端用于发布表单或重定向以获取access_token 的端点(url),但实际方法取决于您使用的身份验证流程(发布与重定向)李>

    用户登录到 Portal1(通过 CAS 服务器)并打开一些页面 Portal1 后端服务器应从 API_C1 和 API_C2 中提取数据以显示页面。这里如何授权API?

    • 使用resource owner password grant,用户在portal1中输入usernamepassword,然后得到access_token,那么当portal1调用API_C1时,只需将access_token附加到调用中即可(HTTP Header:Authorization)(冒充登录用户)

    • 使用authorization code grant 将用户重定向到身份验证服务,在那里输入他们的凭据,然后使用access_token 重定向回portal1(客户端),然后将其附加到对API_C1 的调用以模拟登录用户

    类似主题

    最后,查看与您的问题相关的similar answer

    【讨论】:

    • 感谢您的详细解答。我自己也想出了类似的答案。对于我们的项目,我们使用了 Auth0,结果非常好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-25
    • 2010-11-14
    • 2021-11-08
    • 2013-08-08
    相关资源
    最近更新 更多