分布式系统的身份验证和授权

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,但仍然没有完整的图片。我尝试使用 rubycas 服务器实现 SSO。它工作的非常好。如果必要,我会考虑使用 java cas 实现。
对于我来说,集中 API 授权是相当棘手的问题。我倾向于采用 OAuth2 的方式,但是有一些问题:
1. 是否可以有一个集中化的 OAuth 提供者来服务所有的 API 组件?那么它应该如何工作,需要使用哪些库/宝石? 2. 如何使我的 Web 应用程序 (Portal1 和 Portal2) 默认受信任。我不想让用户为可信应用程序授权访问。 3. 对于原生客户端应用程序(非 Web 环境),我想支持 2 个 legs 的 OAuth。这是正确的选择吗?同时使用 3 个 legs 和 2 个 legs 可行吗? 4. 用户凭证如何转换为 OAuth 令牌?假设以下用例: - 用户登录 Portal1(通过 CAS 服务器)并打开某个页面 - Portal1 后端服务器应该从 API_C1 和 API_C2 中拉取数据以显示页面。如何在此处授权 API?
我有一些想法,比如将 API 组件放在同一个 SSO CAS 会话下。这种方法可以解决我的第四个问题,不需要进行任何编码。但是使用会话来处理 API 是一个糟糕的做法,那么如何混合会话和 OAuth 授权来处理 API 呢?
请指点我正确的方向。也许有其他选项可以实现像定制 OpenId 或 OAuth 提供者支持 SSO 这样的功能吗?
1个回答

2
虽然这是一个旧问题(两年前),但我在这里留下答案,以防有人试图解决类似的问题。
我认为您考虑使用OAUTH是正确的方向,不过我建议您使用 OAUTH协议的2.0版本

集中式授权

是否有可能使用集中式的OAuth提供程序为所有API组件提供服务?如果是这样,它应该如何工作,需要使用哪些库/宝石?

  • OAUTH 2.0允许通过具有独立系统/服务的授权服务来实现此场景,您系统中的其他服务可以信任该服务,并知道如何验证其发行的令牌(例如,通过使用其x.509 cert公钥)。

  • 还有基于SaaS的授权服务器,您甚至可以在没有任何设置成本的情况下使用,例如Auth0

Web客户端

我该如何使我的Web应用程序(Portal1和Portal2)默认受信任。我不想要用户为受信任的应用程序授权访问权限。

使用资源所有者密码授权,用户(资源所有者)使用用户名密码以及已知的client_id(也可以与已知的HTTP来源绑定)对客户端(网站/门户/应用程序)进行身份验证。

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

  • 本机应用程序

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

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

    混合使用

    是否可能同时使用3个legs和2个legs?

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

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

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

    用户通过CAS服务器登录到Portal1并打开某个页面,Portal1后端服务器应从API_C1和API_C2中提取数据以显示该页面。如何在此处授权API?

    • 使用资源所有者密码授权,用户在portal1中输入用户名密码,然后获取一个access_token。当portal1调用API_C1时,它只需将access_token附加到调用上(HTTP头:Authorization)(冒充已登录的用户)。

    • 使用授权码授权,用户被重定向到Auth Service,在那里输入他们的凭据,然后被重定向回portal1(客户端),带有一个access_token,然后将其附加到调用API_C1以模拟已登录的用户。

    类似主题

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


    感谢您详细的回答。我自己也想到了类似的答案。对于我们的项目,我们选择了Auth0,结果非常不错。 - x3mka

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接