Compartilhar via


Solicitar um token de acesso no Azure Active Directory B2C

Importante

A partir de 1º de maio de 2025, o Azure AD B2C não estará mais disponível para compra para novos clientes. Saiba mais em nossas perguntas frequentes.

Um token de acesso contém declarações que você pode usar no Azure AD B2C (Azure Active Directory B2C) para identificar as permissões concedidas às suas APIs. Para chamar um servidor de recursos, a solicitação HTTP deve incluir um token de acesso. Um token de acesso é indicado como access_token nas respostas do Azure AD B2C.

Este artigo mostra como solicitar um token de acesso para um aplicativo Web e a API Web. Para obter mais informações sobre tokens no Azure AD B2C, consulte a visão geral dos tokens no Azure Active Directory B2C.

Observação

Não há suporte para cadeias de API Web (on-Behalf-Of) pelo Azure AD B2C – muitas arquiteturas incluem uma API Web que precisa chamar outra API Web downstream, ambas protegidas pelo Azure AD B2C. Esse cenário é comum em clientes que têm um back-end de API Web, que, por sua vez, chama outro serviço. Este cenário de API Web encadeada pode ter suporte com a concessão da credencial de portador JWT do OAuth 2.0, também conhecida como fluxo On-Behalf-Of. No entanto, o fluxo on-Behalf-Of não é implementado atualmente no Azure AD B2C. Embora o fluxo On-Behalf-Of funcione para aplicativos registrados no Microsoft Entra ID, ele não funciona para aplicativos registrados no Azure AD B2C, independentemente do locatário (Microsoft Entra ID ou Azure AD B2C) que está emitindo os tokens.

Pré-requisitos

Escopos

Os escopos fornecem uma forma de gerenciar as permissões em recursos protegidos. Quando um token de acesso é solicitado, o aplicativo cliente precisa especificar as permissões desejadas no parâmetro de escopo da solicitação. Por exemplo, para especificar o Valor do Escopo de read para a API que tem o URI da ID do Aplicativohttps://contoso.onmicrosoft.com/api, o escopo será https://contoso.onmicrosoft.com/api/read.

Escopos são usados pela API Web para implementar o controle de acesso com base em escopo. Por exemplo, os usuários da API Web podem ter acesso de leitura e gravação ou os usuários da API Web podem ter apenas acesso de leitura. Para adquirir várias permissões na mesma solicitação, você pode adicionar várias entradas no parâmetro de escopo único da solicitação, separadas por espaços.

O exemplo a seguir mostra escopos decodificados em uma URL:

scope=https://contoso.onmicrosoft.com/api/read openid offline_access

O exemplo a seguir mostra escopos codificados em uma URL:

scope=https%3A%2F%2Fcontoso.onmicrosoft.com%2Fapi%2Fread%20openid%20offline_access

Se você solicitar mais escopos do que o permitido para o aplicativo cliente, a chamada terá sucesso se, pelo menos, uma permissão for concedida. A declaração scp no token de acesso resultante é preenchida apenas com as permissões concedidas com êxito.

Escopos do OpenID Connect

O padrão OpenID Connect especifica vários valores de escopo especiais. Os escopos a seguir representam a permissão para acessar o perfil do usuário:

  • openid – Solicita um token de ID.
  • offline_access – Solicita um token de atualização usando fluxos de código de autenticação.
  • 00000000-0000-0000-0000-0000000000000 – Usar a ID do cliente como escopo indica que seu aplicativo precisa de um token de acesso que possa ser usado em seu próprio serviço ou API Web, representado pela mesma ID do cliente.

Se o parâmetro response_type em uma solicitação /authorize incluir token, o parâmetro de escopo deverá incluir pelo menos um escopo de recurso diferente openid e offline_access que será concedido. Caso contrário, a solicitação /authorize falhará.

Solicitar um token

Para solicitar um token de acesso, você precisa de um código de autorização. Veja a seguir um exemplo de uma solicitação para o endpoint /authorize para um código de autorização.

GET https://<tenant-name>.b2clogin.com/<tenant-name>.onmicrosoft.com/<policy-name>/oauth2/v2.0/authorize?
client_id=<application-ID>
&nonce=anyRandomValue
&redirect_uri=https://jwt.ms
&scope=<application-ID-URI>/<scope-name>
&response_type=code

Substitua os valores na cadeia de caracteres de consulta da seguinte maneira:

  • <tenant-name> – O nome do seu locatário do Azure AD B2C. Se você estiver usando um domínio personalizado, substitua tenant-name.b2clogin.com por seu domínio, como contoso.com.
  • <policy-name> - O nome da política personalizada ou do fluxo de usuário.
  • <application-ID> - O identificador de aplicativo do aplicativo Web que você registrou para dar suporte ao fluxo de usuário.
  • <application-ID-URI> - O URI do identificador de aplicativo que você definiu em Expor uma folha de API do aplicativo cliente.
  • <scope-name> - O nome do escopo que você adicionou em Expor uma folha de API do aplicativo cliente.
  • <redirect-uri> - O URI de Redirecionamento que você inseriu quando registrou o aplicativo cliente.

Para ter uma ideia de como a solicitação funciona, cole a solicitação no navegador e execute-a.

Essa é a parte interativa do fluxo, em que você toma medidas. Você precisará concluir o fluxo de trabalho do fluxo do usuário. Isso pode envolver a inserção de seu nome de usuário e senha em um formulário de entrada ou em qualquer outro número de etapas. As etapas concluídas dependem de como o fluxo de usuário é definido.

A resposta com o código de autorização deve ser semelhante a este exemplo:

https://jwt.ms/?code=eyJraWQiOiJjcGltY29yZV8wOTI1MjAxNSIsInZlciI6IjEuMC...

Depois de receber com êxito o código de autorização, você pode usá-lo para solicitar um token de acesso. Os parâmetros estão no corpo da solicitação HTTP POST:

POST <tenant-name>.b2clogin.com/<tenant-name>.onmicrosoft.com/<policy-name>/oauth2/v2.0/token HTTP/1.1
Host: <tenant-name>.b2clogin.com
Content-Type: application/x-www-form-urlencoded

grant_type=authorization_code
&client_id=<application-ID>
&scope=<application-ID-URI>/<scope-name>
&code=eyJraWQiOiJjcGltY29yZV8wOTI1MjAxNSIsInZlciI6IjEuMC...
&redirect_uri=https://jwt.ms
&client_secret=2hMG2-_:y12n10vwH...

Se você quiser testar essa solicitação HTTP POST, poderá usar qualquer cliente HTTP, como o Microsoft PowerShell.

Uma resposta de token bem-sucedida é parecida com esta:

{
    "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6Ilg1ZVhrN...",
    "token_type": "Bearer",
    "not_before": 1549647431,
    "expires_in": 3600,
    "expires_on": 1549651031,
    "resource": "f2a76e08-93f2-4350-833c-965c02483b11",
    "profile_info": "eyJ2ZXIiOiIxLjAiLCJ0aWQiOiJjNjRhNGY3ZC0zMDkxLTRjNzMtYTcyMi1hM2YwNjk0Z..."
}

Ao usar https://jwt.ms para examinar o token de acesso retornado, você deverá ver algo semelhante ao seguinte exemplo:

{
  "typ": "JWT",
  "alg": "RS256",
  "kid": "X5eXk4xyojNFum1kl2Ytv8dl..."
}.{
  "iss": "https://contoso0926tenant.b2clogin.com/c64a4f7d-3091-4c73-a7.../v2.0/",
  "exp": 1549651031,
  "nbf": 1549647431,
  "aud": "f2a76e08-93f2-4350-833c-965...",
  "oid": "1558f87f-452b-4757-bcd1-883...",
  "sub": "1558f87f-452b-4757-bcd1-883...",
  "name": "David",
  "tfp": "B2C_1_signupsignin1",
  "nonce": "anyRandomValue",
  "scp": "read",
  "azp": "38307aee-303c-4fff-8087-d8d2...",
  "ver": "1.0",
  "iat": 1549647431
}.[Signature]

Próximas etapas