【发布时间】: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