Mar*_*ian 5 authentication api oauth-2.0 openid-connect
我们考虑使用 OpenID Connect 和 ID 令牌来对我们的公共 API 进行身份验证。
这些是我们想要涵盖的使用场景:
(1) 和 (2) 的想法是使用 OIDC 隐式授权类型,以便用户在我们的 OpenID Connect 身份提供商处进行交互式身份验证(用户名/密码),并允许 RP(依赖方、客户端)访问用户身份。然后,身份提供者将向 RP 颁发一个短期 ID 令牌、一个刷新令牌和(可选?)一个访问令牌。
对于(3)和(4),交互式认证是不可能的。相反,我们希望向用户颁发令牌,允许他们代表自己访问我们的 API。这些令牌应该是长期存在的,只有当它们在系统中被删除时才会失效。
尽管如此,我们还是希望使用 JWT 就像身份提供者颁发的 ID 令牌一样,作为内部所有 API 请求的身份信息的载体。
我的问题是:
如果您使用隐式流(对于场景 1 和 2),则无法使用刷新令牌。您需要客户端凭据(客户端 ID 和密钥)来请求刷新令牌。在隐式流程中,我们不存储任何客户端凭据。
当客户端是公共客户端(SPA 等)时,在其中存储客户端机密是不安全的。所以公共客户端一般都会使用隐式流。隐式流不支持刷新令牌。一些 OIDC 库实现了静默令牌更新/刷新功能,以避免刷新令牌的缺失。但该模型存在一些限制(您需要与 IDP 进行活动会话才能使续订工作不间断)
TL;DR -> 如果客户端是公共客户端,请使用隐式流(不需要客户端密钥即可从 IDP 获取访问令牌)。隐式流不支持刷新令牌。
可以纯粹使用 OpenID Connect 隐式授权类型颁发的令牌之一来完成此操作吗?
无法将刷新令牌与隐式流一起使用。授权代码流支持刷新令牌,但不能与 SPA 客户端一起使用。因此,您需要 OAuth 2.0/OIDC 流程的组合。
访问令牌是否可以以长期有效(没有过期,仅通过从系统中删除而失效)的方式颁发,然后由客户端与 ID 令牌进行交换?
这是两个不同的事情:
自包含令牌:这些令牌包含验证其真实性所需的所有信息 - 例如发行者详细信息、其有效性等。客户端不需要对 STS 进行后台调用来确认真实性。这些令牌有时很难撤销,并且在令牌中指定的时间内有效。
参考令牌:参考令牌通常是不透明的令牌,其中包含类似 GUID 的标识符,但没有其他详细信息。为了验证这些令牌的真实性,客户端需要对 STS 进行反向通道调用。一个主要优点是可以通过删除 STS DB 中相应的标识符来轻松撤销它。
或者刷新令牌正是用于此目的的东西?
是的。参考上面的评论
或者我们是否必须在 OpenID Connect 之外解决这个问题?这就留下了一个问题:如何根据身份详细信息 (JWT) 解析 API 请求中的不透明令牌,以便在我们的 API/服务中使用?
如果您使用不透明令牌,OIDC/OAuth 2.0 有多个端点(如UserInfo)来获取有关用户的更多信息。您还可以使用内省端点来了解令牌的有效性。
(场景 3 和 4):我不确定您打算如何使用它 - 但对于任何非交互式客户端(自行操作而不代表用户),您应该使用客户端凭据流。
如果客户端想要代表用户执行操作,您应该启用一种方式让用户批准此行为。
归档时间: |
|
查看次数: |
1606 次 |
最近记录: |