OIDC 上下文中的非交互式 API 客户端应使用什么类型的令牌/身份验证?

Mar*_*ian 5 authentication api oauth-2.0 openid-connect

我们考虑使用 OpenID Connect 和 ID 令牌来对我们的公共 API 进行身份验证。

这些是我们想要涵盖的使用场景:

  1. Web UI(单页、客户端 JavaScript 应用程序)
  2. 交互式会话中使用的命令行界面 (CLI)
  3. CLI 非交互式使用,例如在 CI/CD 管道中
  4. 在非交互式会话中执行的其他 API 调用

(1) 和 (2) 的想法是使用 OIDC 隐式授权类型,以便用户在我们的 OpenID Connect 身份提供商处进行交互式身份验证(用户名/密码),并允许 RP(依赖方、客户端)访问用户身份。然后,身份提供者将向 RP 颁发一个短期 ID 令牌、一个刷新令牌和(可选?)一个访问令牌。

对于(3)和(4),交互式认证是不可能的。相反,我们希望向用户颁发令牌,允许他们代表自己访问我们的 API。这些令牌应该是长期存在的,只有当它们在系统中被删除时才会失效。

尽管如此,我们还是希望使用 JWT 就像身份提供者颁发的 ID 令牌一样,作为内部所有 API 请求的身份信息的载体。

我的问题是:

  • 可以纯粹使用 OpenID Connect 隐式授权类型颁发的令牌之一来完成此操作吗?
  • 访问令牌是否可以以长期有效(没有过期,仅通过从系统中删除而失效)的方式颁发,然后由客户端与 ID 令牌进行交换?
  • 或者刷新令牌正是用于此目的的东西?
  • 或者我们是否必须在 OpenID Connect 之外解决这个问题?这就留下了一个问题:如何根据身份详细信息 (JWT) 解析 API 请求中的不透明令牌,以便在我们的 API/服务中使用?

Kar*_*hik 1

如果您使用隐式流(对于场景 1 和 2),则无法使用刷新令牌。您需要客户端凭据(客户端 ID 和密钥)来请求刷新令牌。在隐式流程中,我们不存储任何客户端凭据。

当客户端是公共客户端(SPA 等)时,在其中存储客户端机密是不安全的。所以公共客户端一般都会使用隐式流。隐式流不支持刷新令牌。一些 OIDC 库实现了静默令牌更新/刷新功能,以避免刷新令牌的缺失。但该模型存在一些限制(您需要与 IDP 进行活动会话才能使续订工作不间断)

TL;DR -> 如果客户端是公共客户端,请使用隐式流(不需要客户端密钥即可从 IDP 获取访问令牌)。隐式流不支持刷新令牌。

可以纯粹使用 OpenID Connect 隐式授权类型颁发的令牌之一来完成此操作吗?

无法将刷新令牌与隐式流一起使用。授权代码流支持刷新令牌,但不能与 SPA 客户端一起使用。因此,您需要 OAuth 2.0/OIDC 流程的组合。

访问令牌是否可以以长期有效(没有过期,仅通过从系统中删除而失效)的方式颁发,然后由客户端与 ID 令牌进行交换?

这是两个不同的事情:

  • “通过从系统中删除而无效”:我们正在讨论自包含令牌与参考令牌。

自包含令牌:这些令牌包含验证其真实性所需的所有信息 - 例如发行者详细信息、其有效性等。客户端不需要对 STS 进行后台调用来确认真实性。这些令牌有时很难撤销,并且在令牌中指定的时间内有效。

参考令牌:参考令牌通常是不透明的令牌,其中包含类似 GUID 的标识符,但没有其他详细信息。为了验证这些令牌的真实性,客户端需要对 STS 进行反向通道调用。一个主要优点是可以通过删除 STS DB 中相应的标识符来轻松撤销它。

  • “客户端根据ID 令牌刷新令牌进行交换” - 我假设您指的是刷新令牌而不是 ID 令牌。为此,我们使用刷新令牌

或者刷新令牌正是用于此目的的东西?

是的。参考上面的评论

或者我们是否必须在 OpenID Connect 之外解决这个问题?这就留下了一个问题:如何根据身份详细信息 (JWT) 解析 API 请求中的不透明令牌,以便在我们的 API/服务中使用?

如果您使用不透明令牌,OIDC/OAuth 2.0 有多个端点(如UserInfo)来获取有关用户的更多信息。您还可以使用内省端点来了解令牌的有效性。

(场景 3 和 4):我不确定您打算如何使用它 - 但对于任何非交互式客户端(自行操作而不代表用户),您应该使用客户端凭据流。

如果客户端想要代表用户执行操作,您应该启用一种方式让用户批准此行为。