我正在研究分布式系统的体系结构,基本上是 ruby(rails、sinatra 等)。
我有几个纯 API 组件,比如 API_C1、API_C2、API_C3。它有几个 Web 客户端应用程序,比如 Portal1、Portal2 和一些本地客户端应用程序,比如 Native1。
要求:
- 所有 Web 客户端(Portal1、Portal2)的 SSO,集中式身份验证。
- 所有 API 组件都应通过授权公开其 API。
- 集中式 API 授权。
我做了几个 POC 来尝试一些选项,但仍然没有完整的画面。
我尝试了用于 SSO 的 rubycas 服务器。它工作得很好。如有必要,我考虑使用 java cas 实现。
集中式 API 授权对我来说相当棘手。我倾向于采用 OAuth2 方式,但有一些问题:
- 是否可以让集中式 OAuth 提供者为所有 API 组件提供服务?那么它应该如何工作以及使用哪些库/宝石?
- 如何使我的 Web 应用程序(Portal1 和 Portal2)默认受信任。我不希望用户授权访问受信任的应用程序。
对于本机客户端应用程序(非 Web 环境),我想支持 2 条腿 OAuth。是正确的选择吗?3条腿和2条腿可以同时工作吗?
用户信用如何转化为 oauth 令牌?假设以下用例:
- 用户登录到 Portal1(通过 CAS 服务器)并打开一些页面
- Portal1 后端服务器应从 API_C1 和 API_C2 中提取数据以显示页面。如何在这里授权 API?
我有一些想法,比如在同一个 SSO CAS 会话下拥有 API 组件。这有点允许我的场景 4) 解决,这里没有代码。但是为 API 使用会话是一种不好的做法,那么如何将会话和 OAuth 授权混合用于 API?
请指出正确的方向。是否有其他选项可以做所有事情,例如自定义 OpenId 或 OAuth 提供程序以支持 SSO?