Chamar uma API REST usando a política personalizada do Azure Ative Directory B2C
A política personalizada do Azure Ative Directory B2C (Azure AD B2C) permite que você interaja com a lógica do aplicativo que você implementa fora do Azure AD B2C. Para fazer isso, você faz uma chamada HTTP para um ponto de extremidade. As políticas personalizadas do Azure AD B2C fornecem um perfil técnico RESTful para essa finalidade. Usando esse recurso, você pode implementar recursos que não estão disponíveis na política personalizada do Azure AD B2C.
Neste artigo, vai aprender a:
Crie e implante um aplicativo Node.js de exemplo para uso como um serviço RESTful.
Faça uma chamada HTTP para o serviço RESTful .js nó usando o perfil técnico RESTful.
Manipule ou relate um erro que um serviço RESTful retorna à sua política personalizada.
Descrição geral do cenário
Em Criar ramificação na jornada do usuário usando políticas personalizadas do Azure AD B2C, os usuários que selecionam Conta Pessoal precisam fornecer um código de acesso de convite válido para continuar. Utilizamos um código de acesso estático, mas as aplicações do mundo real não funcionam desta forma. Se o serviço que emite os códigos de acesso for externo à sua política personalizada, você deverá fazer uma chamada para esse serviço e passar o código de acesso inserido pelo usuário para validação. Se o código de acesso for válido, o serviço retornará uma resposta HTTP 200 OK
e o Azure AD B2C emitirá o token JWT. Caso contrário, o serviço retorna uma resposta HTTP 409 Conflict
e o usuário deve inserir novamente um código de acesso.
Pré-requisitos
Se você ainda não tiver um, crie um locatário do Azure AD B2C vinculado à sua assinatura do Azure.
Registre um aplicativo Web e habilite a concessão implícita de token de ID. Para o URI de redirecionamento, use https://jwt.ms.
Você deve ter o Node.js instalado no seu computador.
Você deve ter o Visual Studio Code (VS Code) instalado no seu computador.
Conclua as etapas em Validar entradas de usuário usando a política personalizada do Azure AD B2C. Este artigo faz parte da série de guias de instruções Criar e executar suas próprias políticas personalizadas.
Nota
Este artigo faz parte da série de guias de instruções Criar e executar suas próprias políticas personalizadas no Azure Ative Directory B2C. Recomendamos que comece esta série desde o primeiro artigo.
Etapa 1 - Criar e implantar um aplicativo .js nó
Você precisa implantar um aplicativo, que serve como seu aplicativo externo. Em seguida, sua política personalizada faz uma chamada HTTP para este aplicativo.
Etapa 1.1 - Criar o aplicativo Node.js
Crie uma pasta para hospedar seu aplicativo de nó, como
access-code-app
.No terminal, altere o diretório para a pasta do aplicativo Node, como
cd access-code-app
, e executenpm init -y
. Este comando cria um arquivo padrãopackage.json
para seu projeto Node.js.No terminal, execute
npm install express body-parser
. Este comando instala a estrutura Express e o pacote body-parser .No seu projeto, crie
index.js
um arquivo.No VS Code, abra o ficheiro e, em seguida, adicione o
index.js
seguinte código:const express = require('express'); let bodyParser = require('body-parser') //Create an express instance const app = express(); app.use( bodyParser.json() ); // to support JSON-encoded bodies app.use(bodyParser.urlencoded({ // to support URL-encoded bodies extended: true })); app.post('/validate-accesscode', (req, res) => { let accessCode = '88888'; if(accessCode == req.body.accessCode){ res.status(200).send(); }else{ let errorResponse = { "version" :"1.0", "status" : 409, "code" : "errorCode", "requestId": "requestId", "userMessage" : "The access code you entered is incorrect. Please try again.", "developerMessage" : `The provided code ${req.body.accessCode} does not match the expected code for user.`, "moreInfo" :"https://docs.microsoft.com/en-us/azure/active-directory-b2c/string-transformations" }; res.status(409).send(errorResponse); } }); app.listen(80, () => { console.log(`Access code service listening on port !` + 80); });
Você pode observar que quando um usuário envia um código de acesso errado, você pode retornar um erro diretamente da API REST. As políticas personalizadas permitem que você retorne uma mensagem de erro HTTP 4xx, como o código de status de resposta 400 (solicitação incorreta) ou 409 (Conflito) com um corpo JSON de resposta formatado conforme mostrado na
errorResponse
variável. A fonte do accessCode no aplicativo pode ser lida a partir de um banco de dados. Saiba mais sobre como retornar mensagem de erro de validação.Para testar que o aplicativo funciona conforme o esperado, use as seguintes etapas:
- No terminal, execute o comando para iniciar o servidor de
node index.js
aplicativos. - Para fazer uma solicitação POST semelhante à mostrada neste exemplo, você pode usar um cliente HTTP, como o Microsoft PowerShell ou o Postman:
POST http://localhost/validate-accesscode HTTP/1.1 Host: localhost Content-Type: application/x-www-form-urlencoded accessCode=user-code-code
Substitua
user-code-code
por um código de acesso inserido pelo usuário, como54321
. Se você estiver usando o PowerShell, execute o script a seguir.$accessCode="54321" $endpoint="http://localhost/validate-accesscode" $body=$accessCode $response=Invoke-RestMethod -Method Post -Uri $endpoint -Body $body echo $response
Se você usar um código de acesso incorreto, a resposta será semelhante ao seguinte trecho JSON:
{ "version": "1.0", "status": 409, "code": "errorCode", "requestId": "requestId", "userMessage": "The access code you entered is incorrect. Please try again.", "developerMessage": "The provided code 54321 does not match the expected code for user.", "moreInfo": "https://docs.microsoft.com/en-us/azure/active-directory-b2c/string-transformations" }
- No terminal, execute o comando para iniciar o servidor de
Neste ponto, você está pronto para implantar seu aplicativo Node.js.
Etapa 1.2 - Implantar o aplicativo Node.js no Serviço de Aplicativo do Azure
Para que sua política personalizada alcance seu aplicativo Node.js, ela precisa estar acessível, portanto, você precisa implantá-la. Neste artigo, você implanta o aplicativo usando o Serviço de Aplicativo do Azure, mas usa uma abordagem de hospedagem alternativa.
Siga as etapas em Implantar seu aplicativo no Azure para implantar seu aplicativo .js nó no Azure . Para o Nome do aplicativo, use um nome descritivo como custompolicyapi
. Assim:
O URL do aplicativo é semelhante ao
https://custompolicyapi.azurewebsites.net
.O ponto de extremidade de serviço é semelhante ao
https://custompolicyapi.azurewebsites.net/validate-accesscode
.
Você pode testar o aplicativo implantado usando um cliente HTTP, como o Microsoft PowerShell ou o Postman. Desta vez, use https://custompolicyapi.azurewebsites.net/validate-accesscode
URL como o ponto de extremidade.
Etapa 2 - Chamar a API REST
Agora que seu aplicativo está em execução, você precisa fazer uma chamada HTTP a partir de sua política personalizada. A política personalizada do Azure AD B2C fornece um perfil técnico RESTful que você usa para chamar um serviço externo.
Etapa 2.1 - Definir um perfil técnico RESTful
No arquivo ContosoCustomPolicy.XML
, localize a ClaimsProviders
seção e defina um novo perfil técnico RESTful usando o seguinte código:
<!--<ClaimsProviders>-->
<ClaimsProvider>
<DisplayName>HTTP Request Technical Profiles</DisplayName>
<TechnicalProfiles>
<TechnicalProfile Id="ValidateAccessCodeViaHttp">
<DisplayName>Check that the user has entered a valid access code by using Claims Transformations</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://custompolicyapi.azurewebsites.net/validate-accesscode</Item>
<Item Key="SendClaimsIn">Body</Item>
<Item Key="AuthenticationType">None</Item>
<Item Key="AllowInsecureAuthInProduction">true</Item>
</Metadata>
<InputClaims>
<InputClaim ClaimTypeReferenceId="accessCode" PartnerClaimType="accessCode" />
</InputClaims>
</TechnicalProfile>
</TechnicalProfiles>
</ClaimsProvider>
<!--</ClaimsProviders>-->
A partir do protocolo, você pode observar que configuramos o Perfil Técnico para usar o RestfulProvider. Você também pode observar as seguintes informações na seção de metadados:
O
ServiceUrl
representa o ponto de extremidade da API. O seu valor éhttps://custompolicyapi.azurewebsites.net/validate-accesscode
. Se você implantou seu aplicativo Node.js usando um método alternativo, certifique-se de atualizar o valor do ponto de extremidade.SendClaimsIn
especifica como as declarações de entrada são enviadas para o provedor de declarações RESTful. Valores possíveis:Body (default)
, ,Form
Header
,Url
ouQueryString
. Ao usarBody
, como neste artigo, você invoca o verbo HTTP POST e os dados enviados para a API, se formatados como chave, equivalem pares de valores no corpo da solicitação. Saiba como invocar o verbo HTTP GET e passar dados como cadeia de caracteres de consulta.AuthenticationType
especifica o tipo de autenticação que o provedor de declarações RESTful executa. Nosso provedor de declarações RESTful chama um ponto de extremidade desprotegido, por isso definimos nossoAuthenticationType
como Nenhum. Se você definir o tipo de autenticação comoBearer
, precisará adicionar um elemento CryptographicKeys , que especifica o armazenamento para seu token de acesso. Saiba mais sobre os tipos de autenticação suportados pelo provedor de declarações RESTful.O atributo PartnerClaimType no
InputClaim
especifica como você recebe seus dados na API.
Etapa 2.2 - Atualizar perfil técnico de validação
Em Criar ramificação na jornada do usuário usando a política personalizada do Azure AD B2C, você validou o accessCode usando uma transformação de declarações. Neste artigo, você valida o accessCode fazendo uma chamada HTTP para um serviço externo. Portanto, você precisará atualizar sua política personalizada para refletir a nova abordagem.
Localize o perfil técnico AccessCodeInputCollector e atualize o ReferenceId do elemento ValidationTechnicalProfile para ValidateAccessCodeViaHttp:
De:
<ValidationTechnicalProfile ReferenceId="CheckAccessCodeViaClaimsTransformationChecker"/>
para:
<ValidationTechnicalProfile ReferenceId="ValidateAccessCodeViaHttp"/>
Neste ponto, o perfil técnico com Id
CheckAccessCodeViaClaimsTransformationChecker não é necessário e pode ser removido.
Etapa 3 - Carregar arquivo de política personalizado
Verifique se o aplicativo Node.js está em execução e siga as etapas em Carregar arquivo de política personalizado para carregar seu arquivo de política. Se estiver a carregar um ficheiro com o mesmo nome que o que já se encontra no portal, certifique-se de que seleciona Substituir a política personalizada, caso já exista.
Etapa 4 - Testar a política personalizada
Siga as etapas em Testar a política personalizada para testar sua política personalizada:
- Em Tipo de Conta, selecione Conta Pessoal
- Introduza os restantes detalhes conforme necessário e, em seguida, selecione Continuar. Você verá uma nova tela.
- Para Código de Acesso, digite 88888 e selecione Continuar. Depois que a política terminar a execução, você será redirecionado para
https://jwt.ms
o , e verá um token JWT decodificado. Se você repetir o procedimento e inserir um código de acesso diferente, diferente de 88888, verá um erro, O código de acesso inserido está incorreto. Por favor, tente novamente.
Etapa 5 - Ativar o modo de depuração
No desenvolvimento, você pode querer ver erros detalhados enviados pela API, como developerMessage e moreInfo. Nesse caso, você precisa habilitar o modo de depuração em seu provedor técnico RESTful.
Localize seu provedor técnico ValidateAccessCodeViaHttp e adicione o seguinte item no provedor técnico:
metadata
<Item Key="DebugMode">true</Item>
Salve as alterações e carregue seu arquivo de política.
Teste sua política personalizada. Certifique-se de que utiliza uma introdução errada para o seu Código de Acesso. Você verá um erro semelhante ao mostrado nesta captura de tela:
Lidar com cargas úteis JSON de solicitação complexas
Se a API REST chamada exigir que você envie uma carga JSON complexa, você poderá criar a carga usando transformações de declarações JSON GenerateJson. Depois de gerar a carga útil, você pode usar ClaimUsedForRequestPayload
a opção de metadados para o nome da declaração que contém a carga JSON útil.
Por exemplo, use a seguinte transformação de declarações para gerar uma carga JSON útil:
<ClaimsTransformation Id="GenerateRequestBodyClaimsTransformation" TransformationMethod="GenerateJson">
<InputClaims>
<InputClaim ClaimTypeReferenceId="email" TransformationClaimType="customerEntity.email" />
<InputClaim ClaimTypeReferenceId="objectId" TransformationClaimType="customerEntity.userObjectId" />
<InputClaim ClaimTypeReferenceId="givenName" TransformationClaimType="customerEntity.firstName" />
<InputClaim ClaimTypeReferenceId="surname" TransformationClaimType="customerEntity.lastName" />
<InputClaim ClaimTypeReferenceId="accessCode" TransformationClaimType="customerEntity.accessCode" />
</InputClaims>
<InputParameters>
<InputParameter Id="customerEntity.role.name" DataType="string" Value="Administrator" />
<InputParameter Id="customerEntity.role.id" DataType="long" Value="1" />
</InputParameters>
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="requestBodyPayload" TransformationClaimType="outputClaim" />
</OutputClaims>
</ClaimsTransformation>
O ClaimsTransformation gera o seguinte objeto JSON:
{
"customerEntity":{
"email":"john.s@contoso.com",
"userObjectId":"01234567-89ab-cdef-0123-456789abcdef",
"firstName":"John",
"lastName":"Smith",
"accessCode":"88888",
"role":{
"name":"Administrator",
"id": 1
}
}
}
Em seguida, atualize os Metadados, InputClaimsTransformations, e InputClaims do seu provedor técnico RESTful, conforme mostrado abaixo:
<Metadata>
<Item Key="ClaimUsedForRequestPayload">requestBodyPayload</Item>
<!--Other Metadata items -->
</Metadata>
<!--Execute your InputClaimsTransformations to generate your request Payload-->
<InputClaimsTransformations>
<InputClaimsTransformation ReferenceId="GenerateRequestBodyClaimsTransformation" />
</InputClaimsTransformations>
<InputClaims>
<InputClaim ClaimTypeReferenceId="requestBodyPayload" />
</InputClaims>
Receber dados da API REST
Se sua API REST retornar dados, que você deseja incluir como declarações em sua política, poderá recebê-los especificando declarações no OutputClaims
elemento do perfil técnico RESTful. Se o nome da declaração definida em sua política for diferente do nome definido na API REST, você precisará mapear esses nomes usando o PartnerClaimType
atributo.
Use as etapas em Recebendo dados para saber como formatar os dados esperados pela política personalizada, como manipular valores nulos e como analisar REST o corpo JSON aninhado da API.
Próximos passos
A seguir, aprenda:
Sobre as transformações de declarações JSON.
Sobre o perfil técnico RESTful.
Como criar e ler uma conta de usuário usando a política personalizada do Azure Ative Directory B2C