AAD B2C:在 Hasura 的 JWT 中输出嵌套的 JSON 对象

Dav*_*ave 6 azure-ad-b2c hasura

我们正在使用 Hasura 向消费者提供 GraphQL API。目前我们使用 Auth0 对用户进行身份验证,但我们希望迁移到 Azure AD B2C。

Hasura的 JWT 安全性要求是使用“ https://hasura.io/jwt/claims ”命名空间来提供自定义声明(例如 X-Hasura-Org-Id、X-Hasura-App-Id 等)。

我已经能够通过 AAD B2C 来:

  1. 使用 REST API 收集这些自定义声明所需的值;
  2. 使用;将单个string/值转换为 JSON 对象 和stringCollectionClaimsTransformation
  3. 返回 JWT 中转换后的声明。

但是,我无法弄清楚如何在不转义内容的情况下让 JSON 对象出现在最终的 JWT 中 - 即作为字符串而不是对象输出。

AAD B2C 是否能够输出 JWT 中的嵌套对象?


我们希望实现什么

这就是 Hasura 希望 JWT 命名空间的样子(注意对象https://hasura.io/jwt/claims

{
  "exp": 1588405829,
  "nbf": 1588402229,
  "ver": "1.0",
  "iss": "https://<redacted>.b2clogin.com/<redacted>/v2.0/",
  "sub": "<redacted>",
  "aud": "<redacted>",
  "acr": "b2c_1a_aaa_signupsignin",
  "nonce": "defaultNonce",
  "iat": 1588402229,
  "auth_time": 1588402229,
  "given_name": "Test",
  "family_name": "User",
  "name": "Test User",
  "email": "test@example.com",
  "idp": "facebook.com",
  "https://hasura.io/jwt/claims": {
    "x-hasura-allowed-roles":["role1","role2","role3"],
     "x-hasura-default-role":"role1",
     "x-hasura-org-id":"test-org",
     "x-hasura-user-id":"test-user-id",
     "x-hasura-app-id":"<redacted>"
  }
}
Run Code Online (Sandbox Code Playgroud)

我们现在得到了什么

以下是 AAD B2C 中的 JWT 示例:

{
  "exp": 1588405829,
  "nbf": 1588402229,
  "ver": "1.0",
  "iss": "https://<redacted>.b2clogin.com/<redacted>/v2.0/",
  "sub": "<redacted>",
  "aud": "<redacted>",
  "acr": "b2c_1a_aaa_signupsignin",
  "nonce": "defaultNonce",
  "iat": 1588402229,
  "auth_time": 1588402229,
  "given_name": "Test",
  "family_name": "User",
  "name": "Test User",
  "email": "test@example.com",
  "idp": "facebook.com",
  "https://hasura.io/jwt/claims": "{\"x-hasura-allowed-roles\":[\"role1\",\"role2\",\"role3\"],\"x-hasura-default-role\":\"role1\",\"x-hasura-org-id\":\"test-org\",\"x-hasura-user-id\":\"test-user-id\",\"x-hasura-app-id\":\"<redacted>\"}"
}
Run Code Online (Sandbox Code Playgroud)

似乎没有选项可以将声明存储为对象,而只能存储为字符串。


我们是如何到达那里的

的一个例子ClaimsTransformation

<ClaimsTransformation Id="hasuraClaimsToJson" TransformationMethod="GenerateJson">
  <InputClaims>
    <InputClaim ClaimTypeReferenceId="x-hasura-allowed-roles" TransformationClaimType="x-hasura-allowed-roles" />
    <InputClaim ClaimTypeReferenceId="x-hasura-default-role" TransformationClaimType="x-hasura-default-role" />
    <InputClaim ClaimTypeReferenceId="x-hasura-org-id" TransformationClaimType="x-hasura-org-id" />
    <InputClaim ClaimTypeReferenceId="x-hasura-user-id" TransformationClaimType="x-hasura-user-id" />
  </InputClaims>
  <InputParameters>
    <InputParameter Id="x-hasura-app-id" DataType="string" Value="internal-redacted-uuid" />
  </InputParameters>
  <OutputClaims>
    <OutputClaim ClaimTypeReferenceId="hasuraClaims" TransformationClaimType="outputClaim" />
  </OutputClaims>
</ClaimsTransformation>
Run Code Online (Sandbox Code Playgroud)

配置RelyingParty示例:

<RelyingParty>
  <DefaultUserJourney ReferenceId="SignUpOrSignIn" />
  <TechnicalProfile Id="PolicyProfile">
    <DisplayName>PolicyProfile</DisplayName>
    <Protocol Name="OpenIdConnect" />
    <OutputClaims>
      <OutputClaim ClaimTypeReferenceId="displayName" />
      <OutputClaim ClaimTypeReferenceId="givenName" />
      <OutputClaim ClaimTypeReferenceId="surname" />
      <OutputClaim ClaimTypeReferenceId="email" />
      <OutputClaim ClaimTypeReferenceId="hasuraClaims" PartnerClaimType="https://hasura.io/jwt/claims" />
      <OutputClaim ClaimTypeReferenceId="objectId" PartnerClaimType="sub"/>
      <OutputClaim ClaimTypeReferenceId="identityProvider" />
    </OutputClaims>
    <SubjectNamingInfo ClaimType="sub" />
  </TechnicalProfile>
</RelyingParty>
Run Code Online (Sandbox Code Playgroud)

Vis*_*a K 3

您是否考虑过传入claims_formatHASURA_GRAPHQL_JWT_SECRET stringified_json,以便 Hasura 可以接受字符串而不是对象的声明。我在这里找到了文档条目:https://hasura.io/docs/1.0/graphql/manual/auth/authentication/jwt.html

在此输入图像描述