正如你所注意到的,instagram的响应并不典型。关于用户的数据嵌套在“data”对象中。为了提取值,需要使用声明转换。
这就是技术配置文件最终的样子-
<ClaimsProvider>
<Domain>instagram.com</Domain>
<DisplayName>instagram</DisplayName>
<TechnicalProfiles>
<TechnicalProfile Id="Instagram-OAUTH">
<DisplayName>Instagram</DisplayName>
<Protocol Name="OAuth2" />
<Metadata>
<Item Key="ProviderName">instagram</Item>
<Item Key="authorization_endpoint">https://api.instagram.com/oauth/authorize</Item>
<Item Key="AccessTokenEndpoint">https://api.instagram.com/oauth/access_token</Item>
<Item Key="ClaimsEndpoint">https://api.instagram.com/v1/users/self</Item>
<Item Key="scope">basic</Item>
<Item Key="HttpBinding">POST</Item>
<Item Key="UsePolicyInRedirectUri">0</Item>
<Item Key="client_id">YOUR CLIENT ID HERE</Item>
<Item Key="response_types">code</Item>
</Metadata>
<CryptographicKeys>
<Key Id="client_secret" StorageReferenceId="B2C_1A_InstagramSecret" />
</CryptographicKeys>
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="instagramData" PartnerClaimType="data"/>
<OutputClaim ClaimTypeReferenceId="identityProvider" DefaultValue="instagram.com" />
<OutputClaim ClaimTypeReferenceId="authenticationSource" DefaultValue="socialIdpAuthentication" />
</OutputClaims>
<OutputClaimsTransformations>
<OutputClaimsTransformation ReferenceId="ExtractIDFromResponse" />
<OutputClaimsTransformation ReferenceId="CreateRandomUPNUserName" />
<OutputClaimsTransformation ReferenceId="CreateUserPrincipalName" />
<OutputClaimsTransformation ReferenceId="CreateAlternativeSecurityId" />
<OutputClaimsTransformation ReferenceId="CreateSubjectClaimFromAlternativeSecurityId" />
</OutputClaimsTransformations>
<UseTechnicalProfileForSessionManagement ReferenceId="SM-SocialLogin" />
</TechnicalProfile>
</TechnicalProfiles>
在本技术概要中,您将注意到“extractidfromresponse”转换。这需要添加,并且应该如下所示:
<ClaimsTransformation Id="ExtractIDFromResponse" TransformationMethod="GetClaimFromJson">
<InputClaims>
<InputClaim ClaimTypeReferenceId="instagramData" TransformationClaimType="inputJson" />
</InputClaims>
<InputParameters>
<InputParameter Id="claimToExtract" DataType="string" Value="id" />
</InputParameters>
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="socialIdpUserId" TransformationClaimType="extractedClaim" />
</OutputClaims>
</ClaimsTransformation>
您还需要为数据创建声明类型,如下所示:
<ClaimType Id="instagramData">
<DisplayName>data</DisplayName>
<DataType>string</DataType>
<AdminHelpText>data object from Instagram</AdminHelpText>
<UserHelpText>data object from Instagram</UserHelpText>
</ClaimType
所以本质上,发生的步骤是:
-
b2c从instagram获取json响应
-
b2c将“data”对象映射到“instagramdata”
-
运行一个声明转换,从输入(instagramdata)中提取“id”,并将其保存到socialidpuserid声明中。
为了保存其他变量,如全名,需要相应地添加另一个ClaimsTransformation