Oauth 2.0 “的形状”;法案;系统上下文中令牌交换后的声明

Oauth 2.0 “的形状”;法案;系统上下文中令牌交换后的声明,oauth-2.0,oauth,clientid,token-exchange,Oauth 2.0,Oauth,Clientid,Token Exchange,我目前正在实现一个OAuth令牌交换STS,并且有点挣扎。本标准定义见 我的用例涉及由用户(主体)操作触发的一系列系统到系统的调用。我想确保端点级别的授权是由作用域和白名单上的客户机ID混合完成的。此外,我希望保持客户上下文 我发现令牌交换场景在这里是有效的。该规范给出了一个示例,其中生成的令牌包含授权访问的参与者。但是,规范将逻辑系统(也称为OAuth客户端)放入嵌套参与者信息的“sub”声明中,如下所示: { "aud":"https://service26

我目前正在实现一个OAuth令牌交换STS,并且有点挣扎。本标准定义见 我的用例涉及由用户(主体)操作触发的一系列系统到系统的调用。我想确保端点级别的授权是由作用域和白名单上的客户机ID混合完成的。此外,我希望保持客户上下文

我发现令牌交换场景在这里是有效的。该规范给出了一个示例,其中生成的令牌包含授权访问的参与者。但是,规范将逻辑系统(也称为OAuth客户端)放入嵌套参与者信息的“sub”声明中,如下所示:

{
  "aud":"https://service26.example.com",
  "iss":"https://issuer.example.com",
  "exp":1443904100,
  "nbf":1443904000,
  "sub":"user@example.com",
  "act":
  {
    "sub":"https://service16.example.com",
    "act":
    {
      "sub":"https://service77.example.com"
    }
  }
}
我觉得这有点奇怪。如果actor令牌也是一个个性化令牌(比如,“adminuser”),我希望“sub”声明包含一个实际的主题。在我看来,执行令牌交换的系统将作为参与者令牌发送一个客户端凭据令牌。它不包含“sub”声明,只包含“cid”(client_id)声明。此声明应包含在结果令牌的“act”声明中,因此我希望结果令牌如下所示:

{
  "aud":"https://service26.example.com",
  "iss":"https://issuer.example.com",
  "exp":1443904100,
  "nbf":1443904000,
  "sub":"user@example.com",
  "cid":"3rd_client_that_conducted_token_exchange",
  "act":
  {
    "cid":"2nd_client_id",
    "act":
    {
      "cid":"initial_client_id"
    }
  }
}

我不确定“act”声明是否有必要的结构(据我所知,没有)。这里有没有最佳实践可以遵循?好奇你的想法!:)

法案声明没有标准化的结构,RFC提到的唯一一件事是,它应该包含能够让您识别参与者的任何信息

act
声明是否应包含有关用户或客户端的信息取决于系统的体系结构,以及哪些信息可供其他服务使用或需要。如果您有一个场景,其中用户的权限被委派给管理员,并且您希望在令牌中包含信息,那么您将把管理员的数据放入
act.sub
声明中。但是,如果您想指出一个客户机正在将权限委托给另一个客户机,那么您将在
act.sub
声明中拥有客户机id。如果委托是在客户机而不是用户之间完成的,则客户机ID也可以是主题

请记住,您还可以为令牌交换设置模拟场景。因此,在生成的令牌中,您将没有关于参与者的任何信息。例如,您可以让管理员模拟用户。在执行令牌交换后,您将发出用户的令牌,而不提供任何信息,表明实际是管理员用户在处理该令牌


您提到您有一个系统链,您希望在这些系统之间交换令牌。我相信在这种情况下,客户ID确实会成为您的
act
索赔的主题。如果我理解正确,您有一种情况,即您有一个用户X的令牌,该令牌被发布用于API服务1(声明表明这一点)。然后API服务1想要获得对服务2的访问权,需要交换令牌。它现在获得另一个令牌,其中sub是用户X,观众是服务2,
act。sub
是服务1,因为此服务现在充当用户并希望访问服务2的资源。

感谢您的输入Michal!很高兴看到我没有遗漏更详细地定义
act
索赔的rfc,我感谢您的解释。