authorization - 从第三方服务到给定信息系统上的客户端应用程序的动态授权委托
问题描述
作为一家希望向第三方已知客户提供访问其服务的公司,我设计了一个身份验证/许可系统。
以下是我们的需求:
- 作为服务提供商 (A),我想向另一家公司/客户 (B) 提供对我的服务的访问权限
- 作为 A,我希望能够在我的平台上识别 B,并允许它访问只能由 B(租户)访问的资源池
- 作为 B,我想在 A 上进行身份验证,并让我的用户 (C) 使用一组动态创建的权限临时访问 A
- 作为C,我想直接访问A
这是我想可以满足这些需求的流程
如您所见,它看起来像一个 OAuth2 流。但客户端应用程序从不与授权服务器对话,因为我希望第三方服务动态选择客户端应用程序能够访问的角色和数据。
- 能否请您给我您对这个设计的意见?
- 你认为它相关吗?
- 您是否看到其他方式来满足这种需求?
- 你知道一些已经存在的解决方案来实现这一点吗?(OAuth2 是否适应了这一点?例如,Auth0 是否可以在授权服务器方面满足我们的需求?)
解决方案
您的要求
似乎这些是重要的要求:
- 来自第三方的用户需要能够使用您组织的应用程序(图片中的 C)
- 您的应用 (C) 从您组织的服务 (A) 中获取数据
- 你的服务(A)也需要代表用户调用第三方的API(B)
解决方案特性
最常见的解决方案归结为简单的旧 API / 数据设计,而不是提供快速解决方案的 OAuth。
您组织的数据
让第三方用户登录您的应用程序,以便他们可以使用您的数据。旨在支持联合登录,以便最终用户使用熟悉的密码,并在您的应用程序和第三方应用程序之间启用单点登录。
当应用程序从 A 获取数据时,它将通过指定组织的用户 ID 的 OAuth 令牌来执行此操作。也就是说,您的组织的用户 ID 不包含在 URL 或请求正文中:
获取 /your-api/resources/789
您的 API 将需要根据用户是谁以及可能基于他们来自哪个第三方来授权对资源的访问。
第三方数据
您的应用程序的后端 API (A) 需要代表用户调用 (B) 作为 B2B API。此链接将使用第三方的安全解决方案。一个常见的 OAuth 选项是用于客户端凭据流。
处理用户特定资源的 B2B API 调用通常会在请求 URL 或正文中包含第三方用户 ID:
- 获取 /partner-api/users/abc/resources/234
您的用户数据
感觉每个用户都应该在您的系统中使用某些属性进行建模:
- 您组织的 OAuth 用户 ID(创建时生成)
- 租户 ID(他们来自哪个第三方)
- 第三方用户 ID
- 姓名 + 电子邮件
第三方用户可能会由该公司的管理员加入,他们通过 UI 或 API 提供上述详细信息。
推荐阅读
- php - 从 PHP 函数中删除 eval
- python - 单独的用户帐户
- ionic-framework - 离子电容相机删除图片
- html - CSS Grid 区域没有给出等宽的列
- javascript - 即使对象相同,React- Lodash isEqual 也会返回 false
- python - Django ajax:在调用中不做任何更改
- odoo - 由于 odoo 13 中的并行更新,无法序列化访问
- css - 跨设备的最大宽度和元素的相对大小问题
- javascript - 根据值在两个对象数组之间进行过滤
- angular - 如何使用模拟的 MsalGuard 为 Angular 9 应用程序编写量角器 2e2 测试?