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

OKTA Authorization Server ‘namespace’ for custom claims

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

后端(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",
  "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,
  "Namespace": {
     "CustomClaim1": "xxxxxxxxxxxxxxxxxxx",
     "CustomClaim2": "xxxxxxxxxxxxxxxxxxx"
  }
}

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

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

如何做到这一点?!?!

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

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

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