使用 OAuth 控制不受信任的第三方服务对我们 API 的访问

问题描述 投票:0回答:1

我需要保护对将由不受信任的第三方服务使用的 API 的访问。我当前的调查导致我使用

grant_type=“client_credentials”
传递我为身份服务器中的第 3 方设置的 clientId 和客户端密钥。然而,此流程似乎仅适用于客户端受信任的机器对机器 (MTM) 连接。

我可以理解为什么:如果我使用此流程,使用 HS256,那么我可以看到一个明显的安全缺陷:JWT 是使用共享对称密钥进行签名的。这意味着没有什么可以阻止第三方使用此密钥生成和签署自己的 JWT 令牌并完全绕过身份验证服务器。然而,如果我使用 RS256,这个缺陷就不存在,因为不受信任的一方只能访问公钥,因此他们无法创建自己的签名 JWT。

[编辑]:我现在知道你不应该在客户端验证令牌,因为没有必要,这意味着他们不需要密钥,所以这个“缺陷”没有实际意义。

我的主要问题是:这对于我的用例来说是正确的方法吗?还是我应该在这里使用不同的 OAuth 流程?我读过的所有内容都表明,仅当客户端是资源所有者且受信任时才应使用

client_credentials
授予类型,这不是我的场景 - 然而他们随后声明你必须使用隐式或授权代码 - 这两者需要用户参与,并且对我的用例也无效。

api oauth-2.0 jwt
1个回答
2
投票

有一件事是,您的客户秘密将始终面临被泄露的风险。您对此无能为力 - 就像您的用户密码被泄露一样。这是他们的错。

您可以采取一些措施来使其更加安全(尽管这会给 API 的使用带来一定程度的不便 - 但您始终可以添加 SDK 供第 3 方使用)。但首先,当你说不受信任时,它可能意味着两件事:

非恶意和不受信任(NMU):第三方不会在访问您的服务时故意做任何“坏事”。大多数消费者都会在这里。
  • 恶意且不受信任(MU):第三方可能会做“坏事”。你不知道。如果发生这种情况,那完全是他们的错,他们应该受到责备。不是你。
  • 无论哪种方式,您都可以简单地做到这一点,以便他们继续为每个 API 请求使用您提供的秘密。这是最简单的方法 - 但当然,会增加这个秘密被窃取的机会。

如果您想更进一步,那么您可以使用此秘密向该客户端颁发长期访问令牌。如果使用 JWT,那么签名密钥可以是对称的并保留给您 - 因为他们不需要验证自己这边的令牌。他们只是在每个请求中使用它。这存在一些问题,例如您或他们如何知道此访问令牌是否被盗?另外,一般来说,使用长期存在的 JWT 是一个坏主意,所以如果我是你,我会使用非 jwt 令牌。

如果您想提高级别(最安全):该服务使用您提供给他们的秘密来验证自身。然后,您可以向它们发出短期访问令牌和长期刷新令牌。他们将使用此访问令牌对所有正常的 API 调用进行身份验证,并且当它过期时,他们使用刷新令牌访问特殊的 API 端点以获取新的访问令牌。此外,您可以在每次访问刷新 API 时更改刷新令牌 - 这也将允许您和他们检测令牌盗窃! (参见

这个

)。如果您决定采用这种方法,那么您还必须处理本博客中提到的一些竞争条件和网络故障问题。另外,您还可以更改 JWT 签名密钥,因为您有一个刷新令牌可供使用!但这将为您的问题提供最安全的解决方案。 请注意,第三方服务很可能是 MU 类型,那么您无法采取任何措施来保护他们的服务 - 根据您的服务的用途,他们的数据和“帐户”将受到影响..

© www.soinside.com 2019 - 2024. All rights reserved.