Hi,
I'm required to use an API for sending the email with the OTP. The API has a specific JSON body like so:
{
"reference": "a5747a9c-3124-4ffc-b031-e1db5726950a", // Unique id from client
"sender": {
"emailSubject": "example account email verification code",
"emailReplyTo": "noreply@example.com",
"emailFrom": "noreply@example.com",
"emailFromName": "example"
},
"letterId": "AccountValidation", // do not change this. This is unqiue for Azure B2C
"ReplyToQueue": "",
"receiver": {
"emailTo": "example@example.com"
},
"letterVariables": [
{
"name": "numberAttachments",
"value": "0"
},
{
"name": "title",
"value": "Verify your email address"
},
{
"name": "salutation",
"value": "Dear"
},
{
"name": "message",
"value": "Thanks for validating the account"
},
{
"name": "codeIntro",
"value": "Your code is"
},
{
"name": "otp",
"value": "871400"
},
{
"name": "signature",
"value": "Sincerely"
},
{
"name": "footer",
"value": "This is an automatic generated message from example. Don't reply to this email."
}
]
}
The important part is the "letterVariables" array of objects.
If I use the following transformation I get an empty body:
<ClaimsTransformation Id="GenerateEmailRequestBody" TransformationMethod="GenerateJson">
<InputClaims>
<InputClaim ClaimTypeReferenceId="uniqueEmailReference" TransformationClaimType="reference" />
<InputClaim ClaimTypeReferenceId="email" TransformationClaimType="receiver.emailTo" />
<InputClaim ClaimTypeReferenceId="subject" TransformationClaimType="sender.emailSubject" />
<InputClaim ClaimTypeReferenceId="title" TransformationClaimType="letterVariables.1.value" />
<InputClaim ClaimTypeReferenceId="salutation" TransformationClaimType="letterVariables.2.value" />
<InputClaim ClaimTypeReferenceId="message" TransformationClaimType="letterVariables.3.value" />
<InputClaim ClaimTypeReferenceId="codeIntro" TransformationClaimType="letterVariables.4.value" />
<InputClaim ClaimTypeReferenceId="otp" TransformationClaimType="letterVariables.5.value" />
<InputClaim ClaimTypeReferenceId="signature" TransformationClaimType="letterVariables.6.value" />
<InputClaim ClaimTypeReferenceId="footer" TransformationClaimType="letterVariables.7.value" />
</InputClaims>
<InputParameters>
<InputParameter Id="letterId" DataType="string" Value="AccountValidation" />
<InputParameter Id="ReplyToQueue" DataType="string" Value="" />
<InputParameter Id="sender.emailReplyTo" DataType="string" Value="noreply@example.com" />
<InputParameter Id="sender.emailFrom" DataType="string" Value="noreply@example.com" />
<InputParameter Id="sender.emailFromName" DataType="string" Value="Example" />
<InputParameter Id="letterVariables.0.name" DataType="string" Value="numberAttachments" />
<InputParameter Id="letterVariables.0.value" DataType="string" Value="0" />
<InputParameter Id="letterVariables.1.name" DataType="string" Value="title" />
<InputParameter Id="letterVariables.2.name" DataType="string" Value="salutation" />
<InputParameter Id="letterVariables.3.name" DataType="string" Value="message" />
<InputParameter Id="letterVariables.4.name" DataType="string" Value="codeIntro" />
<InputParameter Id="letterVariables.5.name" DataType="string" Value="otp" />
<InputParameter Id="letterVariables.6.name" DataType="string" Value="signature" />
<InputParameter Id="letterVariables.7.name" DataType="string" Value="footer" />
</InputParameters>
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="emailRequestBody" TransformationClaimType="outputClaim" />
</OutputClaims>
</ClaimsTransformation>
This generates an empty body and throws an exception without any details. Just with trial and error I found out that mixing the order of letterVariables child objects between InputParameter and InputClaim causes this.
So what does work is in example is:
<ClaimsTransformation Id="GenerateEmailRequestBody" TransformationMethod="GenerateJson">
<InputClaims>
<InputClaim ClaimTypeReferenceId="uniqueEmailReference" TransformationClaimType="reference" />
<InputClaim ClaimTypeReferenceId="email" TransformationClaimType="receiver.emailTo" />
<InputClaim ClaimTypeReferenceId="subject" TransformationClaimType="sender.emailSubject" />
<!-- <InputClaim ClaimTypeReferenceId="title" TransformationClaimType="letterVariables.1.value" />
<InputClaim ClaimTypeReferenceId="salutation" TransformationClaimType="letterVariables.2.value" />
<InputClaim ClaimTypeReferenceId="message" TransformationClaimType="letterVariables.3.value" />
<InputClaim ClaimTypeReferenceId="codeIntro" TransformationClaimType="letterVariables.4.value" />
<InputClaim ClaimTypeReferenceId="otp" TransformationClaimType="letterVariables.5.value" />
<InputClaim ClaimTypeReferenceId="signature" TransformationClaimType="letterVariables.6.value" />
<InputClaim ClaimTypeReferenceId="footer" TransformationClaimType="letterVariables.7.value" /> -->
</InputClaims>
<InputParameters>
<InputParameter Id="letterId" DataType="string" Value="AccountValidation" />
<InputParameter Id="ReplyToQueue" DataType="string" Value="" />
<InputParameter Id="sender.emailReplyTo" DataType="string" Value="noreply@example.com" />
<InputParameter Id="sender.emailFrom" DataType="string" Value="noreply@example.com" />
<InputParameter Id="sender.emailFromName" DataType="string" Value="Example" />
<InputParameter Id="letterVariables.0.name" DataType="string" Value="numberAttachments" />
<InputParameter Id="letterVariables.0.value" DataType="string" Value="0" />
<InputParameter Id="letterVariables.1.name" DataType="string" Value="title" />
<InputParameter Id="letterVariables.2.name" DataType="string" Value="salutation" />
<InputParameter Id="letterVariables.3.name" DataType="string" Value="message" />
<InputParameter Id="letterVariables.4.name" DataType="string" Value="codeIntro" />
<InputParameter Id="letterVariables.5.name" DataType="string" Value="otp" />
<InputParameter Id="letterVariables.6.name" DataType="string" Value="signature" />
<InputParameter Id="letterVariables.7.name" DataType="string" Value="footer" />
</InputParameters>
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="emailRequestBody" TransformationClaimType="outputClaim" />
</OutputClaims>
</ClaimsTransformation>
This generates of course all child objects but only with the name property.
Or what also works is this:
<ClaimsTransformation Id="GenerateEmailRequestBody" TransformationMethod="GenerateJson">
<InputClaims>
<InputClaim ClaimTypeReferenceId="uniqueEmailReference" TransformationClaimType="reference" />
<InputClaim ClaimTypeReferenceId="email" TransformationClaimType="receiver.emailTo" />
<InputClaim ClaimTypeReferenceId="subject" TransformationClaimType="sender.emailSubject" />
<InputClaim ClaimTypeReferenceId="title" TransformationClaimType="letterVariables.0.value" />
<InputClaim ClaimTypeReferenceId="title" TransformationClaimType="letterVariables.1.value" />
<InputClaim ClaimTypeReferenceId="salutation" TransformationClaimType="letterVariables.2.value" />
<InputClaim ClaimTypeReferenceId="message" TransformationClaimType="letterVariables.3.value" />
<InputClaim ClaimTypeReferenceId="codeIntro" TransformationClaimType="letterVariables.4.value" />
<InputClaim ClaimTypeReferenceId="otp" TransformationClaimType="letterVariables.5.value" />
<InputClaim ClaimTypeReferenceId="signature" TransformationClaimType="letterVariables.6.value" />
<InputClaim ClaimTypeReferenceId="footer" TransformationClaimType="letterVariables.7.value" />
</InputClaims>
<InputParameters>
<InputParameter Id="letterId" DataType="string" Value="AccountValidation" />
<InputParameter Id="ReplyToQueue" DataType="string" Value="" />
<InputParameter Id="sender.emailReplyTo" DataType="string" Value="noreply@example.com" />
<InputParameter Id="sender.emailFrom" DataType="string" Value="noreply@example.com" />
<InputParameter Id="sender.emailFromName" DataType="string" Value="Example" />
<!-- <InputParameter Id="letterVariables.0.name" DataType="string" Value="numberAttachments" />
<InputParameter Id="letterVariables.0.value" DataType="string" Value="0" />
<InputParameter Id="letterVariables.1.name" DataType="string" Value="title" />
<InputParameter Id="letterVariables.2.name" DataType="string" Value="salutation" />
<InputParameter Id="letterVariables.3.name" DataType="string" Value="message" />
<InputParameter Id="letterVariables.4.name" DataType="string" Value="codeIntro" />
<InputParameter Id="letterVariables.5.name" DataType="string" Value="otp" />
<InputParameter Id="letterVariables.6.name" DataType="string" Value="signature" />
<InputParameter Id="letterVariables.7.name" DataType="string" Value="footer" /> -->
</InputParameters>
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="emailRequestBody" TransformationClaimType="outputClaim" />
</OutputClaims>
</ClaimsTransformation>
This will only generate the value properties of the child objects.
So there is no way to combine InputParameters and InputClaims. I think this is a bug. There is no log or anything about it in application insights....
Any workaround for this?