【问题标题】:Using OpenID Connect ID token for application-to-application authentication/authorization使用 OpenID Connect ID 令牌进行应用程序到应用程序的身份验证/授权
【发布时间】:2016-07-29 07:06:24
【问题描述】:

(对于可能滥用身份验证/授权一词,请提前致歉)

我正在构建几个 Web 应用程序,它们通过如下所示的身份提供者相互通信。

         A -----> idP
        / \
       /   \
      /     \
    \/_     _\/  
    B         C

应用程序 A 将向 B 和 C 发出请求以推送和拉取数据,并且它必须在使用应用程序 A 的用户的上下文中这样做。鉴于我在 idP 上使用 OAuth2,我的第一个想法是使用身份提供者颁发的不记名令牌,并将其传递给每个应用程序,作为从应用程序 A 到 B/C 的“登录”方式。

这种方法的问题是 B/C 不知道该不记名令牌属于谁。为了完成这项工作,我必须在 idP 上创建一个端点,以获取 B/C 可以用来找出用户的用户信息。虽然这可行,但我想看看是否有更标准的东西可以使用。就在那时我发现了 OpenID Connect。

据我所知,OpenID Connect 基本上是用 JWT 替换了不记名令牌,并用私钥对其进行签名以防止篡改。鉴于此,这是我正在考虑的流程:

  • 用户针对 Web 应用程序 A 进行身份验证,应用程序 A 从 idP 接收 ID 令牌,为用户创建登录会话并将 ID 令牌存储为会话的一部分
  • 应用程序 A 需要在用户上下文中从应用程序 B 检索数据,因此它将 ID 令牌作为请求的一部分发送给应用程序 B
  • 应用 B 从标头获取 ID 令牌,从 idP 获取公钥,并验证签名。
  • 如果验证签名,则验证 JWT 的其余部分(到期、颁发者、颁发的时间戳、受众)
  • 如果所有检查都有效,则数据从 B 返回到 A

我有几个关于以这种方式使用 OpenID Connect 的问题:

  • 在 OpenID Connect 中,JWT 的受众字段可以包含多个客户端 ID,但据我了解,idP 应该只返回请求令牌的客户端。那么 idP 是如何知道要在受众字段中添加的其他客户端 ID 的呢?
  • 如何最好地处理注销?由于每个应用程序都维护自己的会话,我的想法是注销应该使应用程序 A/B/C 上的各个会话无效,然后 idP 上的会话完全注销。向每个应用程序发送 AJAX 请求是否最好处理?

【问题讨论】:

    标签: oauth-2.0 jwt openid-connect


    【解决方案1】:

    虽然这不是直接回答您的问题,但让我添加 cmets,因为我目前正在问自己类似的问题。这也是基于我的拙见。

    关于ID 令牌的受众(aud 声明),在初始注册时,您的客户注册可能包括您的客户想要的其他应用程序(也注册为 OAuth 客户)访问。然后,当为您的客户颁发 ID 令牌时,这可以用于始终包含此类受众列表。还要检查应包含您的客户 ID 的 azp(授权方)声明。也就是说,我还没有看到在注册时管理此问题的工具示例。

    关于您对 ID Token 替换不记名令牌(即访问令牌)的评论,我一直在寻找一种在调用另一个应用程序时传递 ID 令牌的标准方式(例如特定的授权标头),但我没有找到任何。我不确定是否应该使用标准授权承载,或者是否有其他标准方式来传递 ID 令牌。

    另请注意,据我所知,ID 令牌除了作为短期令牌外,还有一些限制,如:

    • 它们过期后无法刷新(即使刷新链接的访问令牌也不会返回刷新的 ID 令牌)
    • 它们不能被撤销(即使链接的访问令牌可以),例如管理注销

    它们似乎更倾向于用于启动会话(以类似于 SAML 断言的方式),就像您所描述的那样,但您宁愿将从 UserInfo 端点检索到的 ID 令牌声明和其他信息复制到您的会话信息中因为您的会话可能会比 ID 令牌的持续时间更长。

    话虽如此,如果我们想使用 ID 令牌作为用户身份验证的一些证据,在令牌过期后这将不起作用,所以我不确定在整个会话期间尝试保留和使用它是个好主意。 如果这被用作短调用链的一部分或创建与下游应用程序的新会话(包括使用 ID 令牌启动 JWT 授权类型 OAuth 流作为用户身份的证据),这可能就是目标.

    【讨论】:

    • 感谢您的回复。我也有类似的想法,我有点放弃了这个想法,不管它。大约一年后,我又回来了,我有了通过 API 管理器来解决这个问题的想法。基本上我不会尝试验证另一个应用程序的令牌,而是让 API 管理器验证它,然后为预期的 SP 生成另一个令牌。
    猜你喜欢
    • 2018-01-01
    • 2020-12-26
    • 1970-01-01
    • 2014-09-05
    • 2021-12-03
    • 2015-03-26
    • 2019-01-10
    • 1970-01-01
    • 2018-08-15
    相关资源
    最近更新 更多