如何在B2C自定义策略中提取API响应的id并映射到输出声明?
在Azure AD B2C自定义策略中提取REST API返回数组内的ID
要提取API返回数组中的id并映射到输出声明,需要通过声明定义、输出映射和声明转换三步实现,具体配置如下:
1. 定义所需声明
在<ClaimsSchema>节点下添加三个声明:一个用于接收API返回的数组,一个临时存储数组的单个元素,最后一个存储最终提取出的id:
<ClaimsSchema> <!-- 接收API返回的value数组 --> <ClaimType Id="restApiValueArray"> <DisplayName>REST API Value Array</DisplayName> <DataType>collection</DataType> </ClaimType> <!-- 临时存储数组的单个元素 --> <ClaimType Id="restApiSingleItem"> <DisplayName>Single Item from REST API Array</DisplayName> <DataType>string</DataType> </ClaimType> <!-- 存储最终提取的id --> <ClaimType Id="extractedId"> <DisplayName>Extracted ID</DisplayName> <DataType>string</DataType> </ClaimType> </ClaimsSchema>
2. 配置REST API技术配置文件的输出映射
在调用REST API的Technical Profile中,将API返回的value字段映射到数组类型的声明:
<TechnicalProfile Id="MyRestApiProfile"> <DisplayName>Call Target REST API</DisplayName> <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.RestfulProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> <Metadata> <Item Key="ServiceUrl">https://your-api-endpoint-url</Item> <Item Key="AuthenticationType">None</Item> <Item Key="SendClaimsIn">Body</Item> </Metadata> <OutputClaims> <!-- 映射API返回的value数组到声明 --> <OutputClaim ClaimTypeReferenceId="restApiValueArray" PartnerClaimType="value" /> </OutputClaims> </TechnicalProfile>
3. 添加声明转换提取ID
创建一个用于转换的Technical Profile,结合两个声明转换:先提取数组的第一个元素,再从该元素中解析出id字段:
声明转换定义
<ClaimsTransformations> <!-- 提取数组的第一个元素 --> <ClaimsTransformation Id="GetFirstArrayItem" TransformationMethod="GetSingleItemFromCollectionClaim"> <InputClaims> <InputClaim ClaimTypeReferenceId="restApiValueArray" TransformationClaimType="collection" /> </InputClaims> <OutputClaims> <OutputClaim ClaimTypeReferenceId="restApiSingleItem" TransformationClaimType="collectionItem" /> </OutputClaims> </ClaimsTransformation> <!-- 从单个元素的JSON中提取id字段 --> <ClaimsTransformation Id="ExtractIdFromJsonItem" TransformationMethod="GetClaimFromJson"> <InputClaims> <InputClaim ClaimTypeReferenceId="restApiSingleItem" TransformationClaimType="inputJson" /> </InputClaims> <OutputClaims> <OutputClaim ClaimTypeReferenceId="extractedId" TransformationClaimType="claimToExtract" /> </OutputClaims> <InputParameters> <InputParameter Id="claimToExtract" DataType="string" Value="id" /> </InputParameters> </ClaimsTransformation> </ClaimsTransformations>
转换用Technical Profile
<TechnicalProfile Id="ExtractIdFromApiResponse"> <DisplayName>Extract ID from REST API Array Response</DisplayName> <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.ClaimsTransformationProtocolProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> <OutputClaims> <OutputClaim ClaimTypeReferenceId="extractedId" /> </OutputClaims> <OutputClaimsTransformations> <OutputClaimsTransformation ReferenceId="GetFirstArrayItem" /> <OutputClaimsTransformation ReferenceId="ExtractIdFromJsonItem" /> </OutputClaimsTransformations> </TechnicalProfile>
4. 在用户旅程中按顺序调用
确保先调用REST API的技术配置文件,再调用转换用的配置文件,保证数组数据已存在后再执行提取:
<UserJourney Id="YourUserJourneyId"> <OrchestrationSteps> <!-- 其他业务步骤... --> <OrchestrationStep Order="N" Type="ClaimsExchange"> <ClaimsExchanges> <ClaimsExchange Id="CallRestApi" TechnicalProfileReferenceId="MyRestApiProfile" /> </ClaimsExchanges> </OrchestrationStep> <OrchestrationStep Order="N+1" Type="ClaimsExchange"> <ClaimsExchanges> <ClaimsExchange Id="ExtractId" TechnicalProfileReferenceId="ExtractIdFromApiResponse" /> </ClaimsExchanges> </OrchestrationStep> <!-- 后续步骤可直接使用extractedId声明... --> </OrchestrationSteps> </UserJourney>
内容的提问来源于stack exchange,提问作者Cristiano
相关产品推荐
相关产品推荐

