4

我正在研究分布式系统的体系结构,基本上是 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 使用会话是一种不好的做法,那么如何将会话和 OAuth 授权混合用于 API?

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

4

1 回答 1

2

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


我认为您考虑使用 OAUTH 是正确的方向,但是我建议您使用OAUTH 协议的 2.0 版

集中授权

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

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

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

网络客户端

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

  • 使用资源所有者密码授权,用户(资源所有者)使用username&password以及已知的client_id(也可以绑定到已知的 HTTP 源)向客户端(网站/门户/应用程序)进行身份验证

  • 或者,授权代码授权,其中门户将用户重定向到具有一些 URL 参数的已知授权服务 URL,以便用户在那里进行身份验证并被重定向回门户

原生应用

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

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

混合在一起

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

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

用户信用如何转化为 oauth 令牌?假设以下用例:

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

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

  • 使用资源所有者密码授予用户进入username&password进入portal1,然后access_token获得an,然后当portal1调用API_C1时,它可以附加access_token到调用(HTTP Header:Authorization)(模拟登录用户)

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

类似主题

最后,查看与您的问题相关的类似答案

于 2016-02-16T23:08:36.307 回答