用于自定义声明的 OKTA 授权服务器“命名空间”

问题描述

我有一个授权服务器,它很高兴地根据需要返回各种“开箱即用”和自定义声明,这很棒。

后端(DGraph GraphQL 托管服务器 https://slash.dgraph.io/)需要一个“命名空间”用于我希望它使用的声明,但我的令牌中的所有声明都位于有效负载的根目录中。

我来自 Okta 的示例 JWT 负载是:

{
  "sub": "xxxxxxxxxxxxxxxxxxx","ver": 1,"iss": "https://abc-1234567.okta.com/oauth2/default","aud": "xxxxxxxxxxxxxxxxxxx","iat": 1609590699,"exp": 1609594299,"jti": "ID.xxxxxxxxxxxxxxxxxxx","amr": [
    "pwd"
  ],"idp": "xxxxxxxxxxxxxxxxxxx","nonce": "nonce","auth_time": 1000,"CustomClaim1": "xxxxxxxxxxxxxxxxxxx","CustomClaim2": "xxxxxxxxxxxxxxxxxxx"
}

DGraph 想要的是……

{
  "sub": "xxxxxxxxxxxxxxxxxxx","Namespace": {
     "CustomClaim1": "xxxxxxxxxxxxxxxxxxx","CustomClaim2": "xxxxxxxxxxxxxxxxxxx"
  }
}

我刚刚在写这篇文章时注意到地址范围创建了一个输出,其中有效地有一个带有声明的命名空间,这正是我所追求的

"address": {
    "street_address": "My House","locality": "My Town","region": "My County","postal_code": "My Postcode"
  }"

如何做到这一点?!?!

解决方法

您需要在授权服务器中将命名空间创建为一个声明,然后将命名空间内的每个声明添加到 {} 内该声明的值内,就像您在编写 JSON 一样。

enter image description here

简单复制粘贴的价值 {"one":"one","two":"two","username": appuser.userName}

仍会评估 expression language,因此您可以像往常一样使用用户个人资料中的条件和值。