使用OpenID Connect ID令牌进行应用程序到应用程序的身份验证/授权

时间:2016-04-08 05:51:25

标签: oauth-2.0 jwt openid-connect

(事先道歉可能滥用“身份验证/授权”一词)

我正在构建几个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请求最好处理它吗?

1 个答案:

答案 0 :(得分:3)

虽然这不是直接回答你的问题,但是我要在其中添加评论,因为我目前正在问自己类似的问题。这也是基于我的谦虚理解。

关于 ID令牌的受众群体(aud声明),在初次注册时,您的客户注册可以包含您的客户端的其他应用程序(也注册为OAuth客户端)想要访问。这可以用于在为您的客户发放ID令牌时始终包含此类受众列表。还请检查应包含您的客户ID的azp(授权方)声明。他说,我还没有看到在注册时管理这个工具的例子。

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

另请注意,就我所见,ID令牌除了作为短期令牌外还有其他限制,例如:

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

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

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