系统上下文中令牌交换后“行为”声明的形状

Posted

技术标签:

【中文标题】系统上下文中令牌交换后“行为”声明的形状【英文标题】:Shape of the "act" claim after token exchange in a system context 【发布时间】:2021-05-15 03:20:34 【问题描述】:

我目前正在实施 OAuth 令牌交换 STS,并且有点挣扎。标准定义在https://www.rfc-editor.org/rfc/rfc8693 我的用例涉及由用户(主体)操作触发的系统到系统调用链。我想确保端点级别的授权是由范围和白名单 client_ids 的混合完成的。此外,我想保留客户上下文。

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


  "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"
    
  

我觉得这有点奇怪。如果演员令牌也是个性化令牌(例如“adminuser”),我希望“sub”声明带有实际主题。在我看来,进行令牌交换的系统会将 client_credentials 令牌作为参与者令牌发送。这不包含“sub”声明,而仅包含“cid”(client_id)声明。此声明应包含在生成的令牌的“行为”声明中,因此我希望生成的令牌如下所示:


  "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"
    
  

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

【问题讨论】:

【参考方案1】:

act 声明没有标准化结构,RFC 唯一提到的是它应该包含任何可以让您识别参与者的信息。

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

请记住,您还可以使用模拟场景进行令牌交换。因此,在生成的令牌中,您将没有任何有关演员的信息。例如。您可以让您的管理员模拟用户。执行令牌交换后,您将颁发用户的令牌,但没有任何信息表明实际上是管理员用户正在处理该令牌。

你提到你有一个系统链,你想在它们之间交换代币。我相信对于这种情况,客户端 ID 确实会成为您的 act 声明的主题。如果我理解正确,您会遇到这样一种情况,即您拥有用户 X 的令牌,该令牌用于 API 服务 1(aud 声明表明了这一点)。然后 API 服务 1 想要访问服务 2,并且需要交换令牌。它现在获得另一个令牌,其中 sub 是用户 X,受众是服务 2,act.sub 是服务 1,因为该服务现在充当用户并希望访问服务 2 的资源。

【讨论】:

感谢您的输入米哈尔!很高兴看到我没有错过更详细地定义 act 声明的 rfc,感谢您的解释。

以上是关于系统上下文中令牌交换后“行为”声明的形状的主要内容,如果未能解决你的问题,请参考以下文章

警报处理程序中交换上下文后的分段错误

从 SID 创建用户令牌,在用户上下文中展开环境变量

用户服务

用户上下文信息

推荐系统之--- 利用用户行为数据

SpringBoot 数据库事务7种传播行为