使用(或不使用)OAuth 进行 SOA 中的内部服务到服务通信

信息安全 验证 oauth
2021-09-07 01:50:21

因此,我们是一群学生,为我们的大学打造了一个在线平台。我们将我们的平台建模为一组服务。

例如,服务“A”可能只存储用户的个人信息,并在其上公开一个 REST API。另一个服务“B”可能只发送电子邮件。

粗略的结构如下所示: 粗略的 SOA 架构

现在我们想使用 OAuth 进行身份验证和授权(我知道 OAuth 是一个授权框架,但我们想大致做 google 所做的事情)。

一个典型的场景可能是这样的:

  1. 用户请求服务“A”的网页。
  2. 服务“A”看到该用户未通过身份验证,因此它将向身份验证服务器发送重定向。
  3. 用户输入其凭据,然后将访问令牌授予服务“A”。

现在,服务“A”可能需要调用另一个服务“B”。请注意,这是一个内部服务器到服务器请求各种其他服务可能正在调用服务“B”。

我想确保在调用服务“B”时,只有允许的服务才能调用它。例如,“A”有权调用“B”,但“C”没有。换句话说,我想确保只有特定服务的白名单调用者才能调用它

所以我的问题是,是否可以使用 OAuth 保护内部服务到服务调用?

可以以更简单但安全的方式完成吗?

我不希望令牌委托:也就是说,我不希望向服务 A 发出的第一个令牌在其他地方使用。假设如果“A”正在调用“B”,那么“A”有权这样做,即使没有用户登录。

我的尝试:(可能是错误的,请纠正我) * Auth 服务器可以向每个服务发布 clientIds 和客户端密码。* 想要调用另一个服务的服务使用密钥和秘密向 Auth 服务器标识自己。* 如果服务被允许调用目标服务,则授权服务器颁发令牌,否则返回禁止。

但即使在这种情况下,Auth 服务器也做的太多了。

每个服务本身不能控制其他服务可以调用它吗?

谢谢。

3个回答

这开始是一个评论,但它变得有点大,所以我把它移到了“答案”。

OAuth2.0 规范中缺少的步骤是“后端通信”:授权服务器和各种服务就什么是有效令牌以及与之关联的范围达成一致的部分。这些“实施细节”由 OAuth 服务提供商自行决定。

此外,可以通过更接近 OAuth2.0 术语来改进您的图表(我并不是说您做得不好,图表很有帮助,但可能更清楚)。

在这种情况下,您的“用户”(大概)是资源所有者“前端”可能(我在这里猜)是一个单页应用程序,在User Agent内运行。

API 服务器授权服务器接收访问令牌以代表资源所有者访问数据。

换句话说,您的图表缺少“用户”和“身份验证服务器”之间的通信。

对于 OAuth 的流程,也许下图会有所帮助:

在此处输入图像描述 图 1:(机密)客户端的 OAuth 流程。

回答您的问题:OAuth 是关于从资源所有者授权某些服务以代表他们访问资源所有者的数据。

因此,使用 OAuth 可能不是您的最佳选择。但是,我不知道有任何开箱即用的解决方案可以真正解决您的问题(代表用户授权访问权限)。您可以查看基于授权的访问控制 (ZBAC),但对于您想要实现的目标而言,这可能有点过头了。

你的尝试已经成功了一半。

OAuth2 中有一种授权类型,称为Client Credentials,这可能是您正在寻找的。

客户端使用客户端凭据授予类型来获取用户上下文之外的访问令牌。

基本上,客户端将其客户端 ID 和客户端密钥交换为访问令牌,然后它可以使用该令牌代表自己资源服务器发出请求。

 +---------+                                  +---------------+
 |         |                                  |               |
 |         |>--(A)- Client Authentication --->| Authorization |
 | Client  |                                  |     Server    |
 |         |<--(B)---- Access Token ---------<|               |
 |         |                                  |               |
 +---------+                                  +---------------+

查看这些以获取更多信息:

https://oauth.net/2/grant-types/client-credentials/

https://www.oauth.com/oauth2-servers/access-tokens/client-credentials/

也许我遗漏了一些东西,但是如果那时您只想控制哪些服务可以调用给定的服务 X 例如它们可以调用所有端点或不调用端点,那么为什么不使用基本身份验证和服务 X?然后,另一个服务将具有服务 X 的基本身份验证凭据,或者没有。显然这里的坏处是 - 如果凭据泄漏,您需要更新所有拥有它们的服务。个人凭据限制了该范围,并允许您根据使用的凭据识别呼叫者。