Solicitud de token de acceso en Azure Active Directory B2CRequest an access token in Azure Active Directory B2C

Un token de acceso contiene notificaciones que puede usar en Azure Active Directory B2C (Azure AD B2C) para identificar los permisos concedidos a las API.An access token contains claims that you can use in Azure Active Directory B2C (Azure AD B2C) to identify the granted permissions to your APIs. Al llamar a un servidor de recursos, debe incluirse un token de acceso en la solicitud HTTP.When calling a resource server, an access token must be present in the HTTP request. Un token de acceso se indica como access_token en las respuestas de Azure AD B2C.An access token is denoted as access_token in the responses from Azure AD B2C.

Este artículo muestra cómo solicitar un token de acceso para una aplicación web y una API web.This article shows you how to request an access token for a web application and web API. Para más información sobre los tokens en Azure AD B2C, consulte Información general de tokens de Azure Active Directory B2C.For more information about tokens in Azure AD B2C, see the overview of tokens in Azure Active Directory B2C.

Nota

Las cadenas de la API web (en nombre de) no son compatibles con Azure AD B2C.Web API chains (On-Behalf-Of) is not supported by Azure AD B2C. - Muchas arquitecturas incluyen una API web que necesita llamar a otra API web de nivel inferior, ambas protegidas mediante Azure AD B2C.- Many architectures include a web API that needs to call another downstream web API, both secured by Azure AD B2C. Este escenario es común en clientes que tienen un back-end de API web, que a su vez llama a otro servicio.This scenario is common in clients that have a web API back end, which in turn calls a another service. Este escenario de API web encadenadas puede admitirse mediante la concesión de credenciales de portador JWT de OAuth 2.0, también conocido como flujo "en nombre de".This chained web API scenario can be supported by using the OAuth 2.0 JWT Bearer Credential grant, otherwise known as the On-Behalf-Of flow. Sin embargo, el flujo "en nombre de" no está implementado actualmente en Azure AD B2C.However, the On-Behalf-Of flow is not currently implemented in Azure AD B2C.

Requisitos previosPrerequisites

ÁmbitosScopes

Los ámbitos proporcionan una manera de administrar permisos para los recursos protegidos.Scopes provide a way to manage permissions to protected resources. Cuando se selecciona un token de acceso, la aplicación cliente debe especificar los permisos que desea en el parámetro scope de la solicitud.When an access token is requested, the client application needs to specify the desired permissions in the scope parameter of the request. Por ejemplo, para determinar el Valor de ámbito de read de la API que tiene el identificador URI de id. de aplicación de https://contoso.onmicrosoft.com/api, el ámbito sería https://contoso.onmicrosoft.com/api/read.For example, to specify the Scope Value of read for the API that has the App ID URI of https://contoso.onmicrosoft.com/api, the scope would be https://contoso.onmicrosoft.com/api/read.

La API web utiliza los ámbitos para implementar el control de acceso basado en el ámbito.Scopes are used by the web API to implement scope-based access control. Por ejemplo, los usuarios de la API web pueden tener ambos accesos de lectura y de escritura, o pueden tener solo acceso de lectura.For example, users of the web API could have both read and write access, or users of the web API might have only read access. Para adquirir varios permisos en la misma solicitud, puede agregar varias entradas en el parámetro scope único de la solicitud, separadas por espacios.To acquire multiple permissions in the same request, you can add multiple entries in the single scope parameter of the request, separated by spaces.

El ejemplo siguiente muestra ámbitos descodificados en una dirección URL:The following example shows scopes decoded in a URL:

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

El ejemplo siguiente muestra ámbitos codificados en una dirección URL:The following example shows scopes encoded in a URL:

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

Si solicita más ámbitos que los que se conceden para la aplicación cliente, la llamada se realiza correctamente si se concede al menos un permiso.If you request more scopes than what is granted for your client application, the call succeeds if at least one permission is granted. La notificación scp del token de acceso resultante se rellena solo con los permisos que se concedieron correctamente.The scp claim in the resulting access token is populated with only the permissions that were successfully granted.

Ámbitos de OpenID ConnectOpenID Connect scopes

El estándar OpenID Connect especifica varios valores de ámbito especiales.The OpenID Connect standard specifies several special scope values. Los ámbitos siguientes representan el permiso para acceder al perfil del usuario:The following scopes represent the permission to access the user's profile:

  • openid: solicita un token de identificador.openid - Requests an ID token.
  • offline_access: solicita un token de actualización con flujos de código de autenticación.offline_access - Requests a refresh token using Auth Code flows.
  • 00000000-0000-0000-0000-000000000000: el uso del identificador de cliente como ámbito indica que la aplicación necesita un token de acceso que se puede usar con su propio servicio o API web, representado por el mismo identificador de cliente.00000000-0000-0000-0000-000000000000 - Using the client ID as the scope indicates that your app needs an access token that can be used against your own service or web API, represented by the same client ID.

Si el parámetro response_type de una solicitud de /authorize incluye token, el parámetro scope debe incluir al menos un ámbito de recurso (distinto de openid y offline_access) para su concesión.If the response_type parameter in an /authorize request includes token, the scope parameter must include at least one resource scope other than openid and offline_access that will be granted. En caso contrario, se produce un error en la solicitud /authorize.Otherwise, the /authorize request fails.

Solicitud de un tokenRequest a token

Para solicitar un token de acceso, necesita un código de autorización.To request an access token, you need an authorization code. A continuación se muestra un ejemplo de solicitud de código de autorización al punto de conexión /authorize.Below is an example of a request to the /authorize endpoint for an authorization code. Los dominios personalizados no se admiten para usarse con tokens de acceso.Custom domains are not supported for use with access tokens. Use su dominio tenant-name.onmicrosoft.com en la URL de solicitud.Use your tenant-name.onmicrosoft.com domain in the request URL.

En el ejemplo siguiente, reemplace estos valores:In the following example, you replace these values:

  • <tenant-name>: el nombre de su inquilino de Azure AD B2C.<tenant-name> - The name of your Azure AD B2C tenant.
  • <policy-name>: el nombre de su directiva o flujo de usuarios personalizados.<policy-name> - The name of your custom policy or user flow.
  • <application-ID>: el identificador de la aplicación web que ha registrado para admitir el flujo de usuario.<application-ID> - The application identifier of the web application that you registered to support the user flow.
  • <redirect-uri>: el identificador URI de redirección que especificó al registrar la aplicación cliente.<redirect-uri> - The Redirect URI that you entered when you registered the client application.
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=https://<tenant-name>.onmicrosoft.com/api/read
&response_type=code

La respuesta con el código de autorización debe ser similar a este ejemplo:The response with the authorization code should be similar to this example:

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

Después de recibir correctamente el código de autorización, puede usarlo para solicitar un token de acceso:After successfully receiving the authorization code, you can use it to request an access token:

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=https://<tenant-name>.onmicrosoft.com/api/read
&code=eyJraWQiOiJjcGltY29yZV8wOTI1MjAxNSIsInZlciI6IjEuMC...
&redirect_uri=https://jwt.ms
&client_secret=2hMG2-_:y12n10vwH...

Debe ver algo parecido a la siguiente respuesta:You should see something similar to the following response:

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

Cuando se usa https://jwt.ms para examinar el token de acceso devuelto, debe ver algo similar al ejemplo siguiente:When using https://jwt.ms to examine the access token that was returned, you should see something similar to the following example:

{
  "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]

Pasos siguientesNext steps