Inicio de sesión web con OpenID Connect en Azure Active Directory B2CWeb sign-in with OpenID Connect in Azure Active Directory B2C

OpenID Connect es un protocolo de autenticación basado en OAuth 2.0 que se puede usar para que los usuarios inicien sesión de forma segura en las aplicaciones web.OpenID Connect is an authentication protocol, built on top of OAuth 2.0, that can be used to securely sign users in to web applications. Con la implementación de OpenID Connect de Azure Active Directory B2C (Azure AD B2C) puede externalizar el registro, el inicio de sesión y otras experiencias de administración de identidades en sus aplicaciones web a Azure Active Directory (Azure AD).By using the Azure Active Directory B2C (Azure AD B2C) implementation of OpenID Connect, you can outsource sign-up, sign-in, and other identity management experiences in your web applications to Azure Active Directory (Azure AD). Esta guía le enseñará cómo hacerlo de manera independiente del lenguaje.This guide shows you how to do so in a language-independent manner. En ella se describe cómo enviar y recibir mensajes HTTP sin utilizar ninguna de nuestras bibliotecas de código abierto.It describes how to send and receive HTTP messages without using any of our open-source libraries.

OpenID Connect amplía el protocolo de autorización de OAuth 2.0 para su uso como protocolo de autenticación.OpenID Connect extends the OAuth 2.0 authorization protocol for use as an authentication protocol. Este protocolo de autenticación permite realizar el inicio de sesión único.This authentication protocol allows you to perform single sign-on. Presenta el concepto de un token de identificador, que permite al cliente comprobar la identidad del usuario y obtener información del perfil básica sobre el usuario.It introduces the concept of an ID token, which allows the client to verify the identity of the user and obtain basic profile information about the user.

Al ampliar OAuth 2.0, también permite que las aplicaciones adquieran tokens de acceso de forma segura.Because it extends OAuth 2.0, it also enables applications to securely acquire access tokens. Se puede usar access_tokens para acceder a los recursos protegidos por un servidor de autorización.You can use access tokens to access resources that are secured by an authorization server. Se recomienda OpenID Connect si va a crear una aplicación web que esté hospedada en un servidor y a la que se accede mediante un explorador.OpenID Connect is recommended if you're building a web application that's hosted on a server and accessed through a browser. Si desea agregar administración de identidades a sus aplicaciones móviles o de escritorio con Azure AD B2C, debe usar OAuth 2.0, en lugar de OpenID Connect.If you want to add identity management to your mobile or desktop applications using Azure AD B2C, you should use OAuth 2.0 rather than OpenID Connect. Para más información sobre los tokens, consulte Información general de tokens de Azure Active Directory B2C.For more information about tokens, see the Overview of tokens in Azure Active Directory B2C

Azure AD B2C extiende el protocolo OpenID Connect estándar para realizar algo más que una autorización y autenticación simples.Azure AD B2C extends the standard OpenID Connect protocol to do more than simple authentication and authorization. Presenta el parámetro de flujo de usuario, que le permite usar OpenID Connect para agregar experiencias de usuario (como registro, inicio de sesión y administración de perfiles) a su aplicación.It introduces the user flow parameter, which enables you to use OpenID Connect to add user experiences to your application, such as sign-up, sign-in, and profile management.

Envío de solicitudes de autenticaciónSend authentication requests

Cuando su aplicación web necesite autenticar al usuario y ejecutar el flujo de usuario, puede dirigir al usuario al punto de conexión /authorize.When your web application needs to authenticate the user and run a user flow, it can direct the user to the /authorize endpoint. El usuario realiza una acción en función del flujo de usuario.The user takes action depending on the user flow.

En esta solicitud, el cliente indica los permisos que necesita adquirir del usuario en el parámetro scope y el flujo de usuario que se va a ejecutar en el parámetro p.In this request, the client indicates the permissions that it needs to acquire from the user in the scope parameter and the user flow to run in the p parameter. En las siguientes secciones se proporcionan tres ejemplos (con saltos de línea para facilitar la lectura), cada uno con un flujo de usuario diferente.Three examples are provided in the following sections (with line breaks for readability), each using a different user flow. Para hacerse una idea de cómo funciona cada solicitud, intente pegar la solicitud en un explorador y volver a ejecutarlo.To get a feel for how each request works, try pasting the request into a browser and running it. Puede reemplazar fabrikamb2c por el nombre de su inquilino si tiene uno y ha creado un flujo de usuario.You can replace fabrikamb2c with the name of your tenant if you have one and have created a user flow.

Usar un flujo de usuario de inicio de sesiónUse a sign-in user flow

GET https://fabrikamb2c.b2clogin.com/fabrikamb2c.onmicrosoft.com/oauth2/v2.0/authorize?
client_id=90c0fe63-bcf2-44d5-8fb7-b8bbc0b29dc6
&response_type=code+id_token
&redirect_uri=https%3A%2F%2Faadb2cplayground.azurewebsites.net%2F
&response_mode=form_post
&scope=openid%20offline_access
&state=arbitrary_data_you_can_receive_in_the_response
&nonce=12345
&p=b2c_1_sign_in

Usar un flujo de usuario de registroUse a sign-up user flow

GET https://fabrikamb2c.b2clogin.com/fabrikamb2c.onmicrosoft.com/oauth2/v2.0/authorize?
client_id=90c0fe63-bcf2-44d5-8fb7-b8bbc0b29dc6
&response_type=code+id_token
&redirect_uri=https%3A%2F%2Faadb2cplayground.azurewebsites.net%2F
&response_mode=form_post
&scope=openid%20offline_access
&state=arbitrary_data_you_can_receive_in_the_response
&nonce=12345
&p=b2c_1_sign_up

Usar un flujo de usuario de edición de perfilUse an edit-profile user flow

GET https://fabrikamb2c.b2clogin.com/fabrikamb2c.onmicrosoft.com/oauth2/v2.0/authorize?
client_id=90c0fe63-bcf2-44d5-8fb7-b8bbc0b29dc6
&response_type=code+id_token
&redirect_uri=https%3A%2F%2Faadb2cplayground.azurewebsites.net%2F
&response_mode=form_post
&scope=openid%20offline_access
&state=arbitrary_data_you_can_receive_in_the_response
&nonce=12345
&p=b2c_1_edit_profile
ParámetroParameter ObligatorioRequired DESCRIPCIÓNDescription
client_idclient_id Yes Identificador de aplicación que Azure Portal asignó a la aplicación.The application ID that the Azure portal assigned to your application.
response_typeresponse_type Yes Debe incluir un token de identificador para OpenID Connect.Must include an ID token for OpenID Connect. Si su aplicación web también necesita tokens para llamar a una API web, puede usar code+id_token.If your web application also needs tokens for calling a web API, you can use code+id_token.
redirect_uriredirect_uri SinNo El parámetro redirect_uri de su aplicación, donde su aplicación puede enviar y recibir las respuestas de autenticación.The redirect_uri parameter of your application, where authentication responses can be sent and received by your application. Debe coincidir exactamente con uno de los parámetros redirect_uri que registró en Azure Portal, con la excepción de que debe estar codificado como URL.It must exactly match one of the redirect_uri parameters that you registered in the Azure portal, except that it must be URL encoded.
scopescope Yes Una lista de ámbitos separada por espacios.A space-separated list of scopes. El ámbito openid indica un permiso para iniciar sesión con el usuario y obtener los datos del usuario en forma de tokens de identificador.The openid scope indicates a permission to sign in the user and get data about the user in the form of ID tokens. El ámbito offline_access es opcional para las aplicaciones web.The offline_access scope is optional for web applications. Indica que la aplicación necesita un token de actualización para un acceso ampliado a los recursos.It indicates that your application will need a refresh token for extended access to resources.
response_moderesponse_mode SinNo El método que se usa para devolver el código de autorización resultante a la aplicación.The method that is used to send the resulting authorization code back to your application. Puede ser query, form_post o fragment.It can be either query, form_post, or fragment. Para mayor seguridad se recomienda el modo de respuesta form_post.The form_post response mode is recommended for best security.
statestate SinNo Un valor incluido en la solicitud que también se devolverá en la respuesta del token.A value included in the request that's also returned in the token response. Puede ser una cadena de cualquier contenido que desee.It can be a string of any content that you want. Se utiliza normalmente un valor único generado de forma aleatoria para evitar los ataques de falsificación de solicitudes entre sitios.A randomly generated unique value is typically used for preventing cross-site request forgery attacks. El estado también se usa para codificar información sobre el estado del usuario en la aplicación antes de que se haya producido la solicitud de autenticación, por ejemplo, la página en la que estaban.The state is also used to encode information about the user's state in the application before the authentication request occurred, such as the page they were on.
valor de seguridadnonce Yes Un valor incluido en la solicitud, generada por la aplicación, que se incluirá en el token de identificador resultante como una notificación.A value included in the request (generated by the application) that is included in the resulting ID token as a claim. La aplicación puede comprobar este valor para mitigar los ataques de reproducción de token.The application can then verify this value to mitigate token replay attacks. Normalmente, el valor es una cadena única aleatoria que se puede usar para identificar el origen de la solicitud.The value is typically a randomized unique string that can be used to identify the origin of the request.
pp Yes Flujo de usuario que se ejecuta.The user flow that is run. Es el nombre del flujo de usuario que se crea en el arrendatario de Azure AD B2C.It is the name of a user flow that's created in your Azure AD B2C tenant. El nombre del flujo de usuario debe comenzar por b2c\_1\_.The name of the user flow should begin with b2c\_1\_.
símbolo del sistemaprompt SinNo El tipo de interacción con el usuario que se necesita.The type of user interaction that's required. El único valor válido en este momento es login, que obliga al usuario a escribir sus credenciales en esa solicitud.The only valid value at this time is login, which forces the user to enter their credentials on that request.

En este punto se pedirá al usuario que complete el flujo de trabajo.At this point, the user is asked to complete the workflow. Puede que el usuario tenga que escribir su nombre de usuario y contraseña, iniciar sesión con una identidad social o registrarse en el directorio.The user might have to enter their username and password, sign in with a social identity, or sign up for the directory. Podría haber cualquier otro número de pasos en función de cómo se define el flujo de usuario.There could be any other number of steps depending on how the user flow is defined.

Una vez que el usuario haya completado el flujo de usuario, se devuelve una respuesta a la aplicación en el parámetro redirect_uri indicado, mediante el método que se especifica en el parámetro response_mode.After the user completes the user flow, a response is returned to your application at the indicated redirect_uri parameter, by using the method that's specified in the response_mode parameter. La respuesta es la misma para cada uno de los casos anteriores, con independencia del flujo de usuario.The response is the same for each of the preceding cases, independent of the user flow.

Una respuesta correcta al usar response_mode=fragment tiene el siguiente aspecto:A successful response using response_mode=fragment would look like:

GET https://aadb2cplayground.azurewebsites.net/#
id_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik5HVEZ2ZEstZnl0aEV1Q...
&code=AwABAAAAvPM1KaPlrEqdFSBzjqfTGBCmLdgfSTLEMPGYuNHSUYBrq...
&state=arbitrary_data_you_can_receive_in_the_response
ParámetroParameter DESCRIPCIÓNDescription
ID_tokenid_token El token de identificador que solicitó la aplicación.The ID token that the application requested. Puede usar el token de identificador para comprobar la identidad del usuario y comenzar una sesión con el usuario.You can use the ID token to verify the user's identity and begin a session with the user.
códigocode El código de autorización que solicitó la aplicación, si usó response_type=code+id_token.The authorization code that the application requested, if you used response_type=code+id_token. La aplicación puede utilizar el código de autorización con el fin de solicitar un token de acceso para un recurso de destino.The application can use the authorization code to request an access token for a target resource. Los códigos de autorización normalmente expiran después de unos 10 minutos.Authorization codes typically expire after about 10 minutes.
statestate Si un parámetro state está incluido en la solicitud, debería aparecer el mismo valor en la respuesta.If a state parameter is included in the request, the same value should appear in the response. La aplicación debe comprobar que los valores state de la solicitud y de la respuesta sean idénticos.The application should verify that the state values in the request and response are identical.

Las respuestas de error también se pueden enviar al parámetro redirect_uri para que la aplicación pueda controlarlas de manera adecuada:Error responses can also be sent to the redirect_uri parameter so that the application can handle them appropriately:

GET https://aadb2cplayground.azurewebsites.net/#
error=access_denied
&error_description=the+user+canceled+the+authentication
&state=arbitrary_data_you_can_receive_in_the_response
ParámetroParameter DESCRIPCIÓNDescription
errorerror Un código que puede usarse para clasificar los tipos de errores que se producen.A code that can be used to classify the types of errors that occur.
error_descriptionerror_description Un mensaje de error específico que puede ayudarlo a identificar la causa raíz de un error de autenticación.A specific error message that can help identify the root cause of an authentication error.
statestate Si un parámetro state está incluido en la solicitud, debería aparecer el mismo valor en la respuesta.If a state parameter is included in the request, the same value should appear in the response. La aplicación debe comprobar que los valores state de la solicitud y de la respuesta sean idénticos.The application should verify that the state values in the request and response are identical.

Validar el token de identificadorValidate the ID token

Recibir un token de identificador no es suficiente para autenticar al usuario.Just receiving an ID token is not enough to authenticate the user. Debe validar la firma del token de identificador y comprobar las notificaciones en el token en función de los requisitos de la aplicación.Validate the ID token's signature and verify the claims in the token per your application's requirements. Azure AD B2C usa tokens web JSON (JWT) y la criptografía de clave pública para firmar los tokens y comprobar que son válidos.Azure AD B2C uses JSON Web Tokens (JWTs) and public key cryptography to sign tokens and verify that they are valid. Hay muchas bibliotecas de código abierto disponibles para validar los JWT, según el lenguaje de preferencia.There are many open-source libraries that are available for validating JWTs, depending on your language of preference. Se recomienda explorar esas opciones en lugar de implementar su propia lógica de validación.We recommend exploring those options rather than implementing your own validation logic.

Azure AD B2C tiene un extremo de metadatos OpenID Connect, que permite a una aplicación obtener información sobre Azure AD B2C en tiempo de ejecución.Azure AD B2C has an OpenID Connect metadata endpoint, which allows an application to get information about Azure AD B2C at runtime. En esta información se incluyen los extremos, los contenidos del token y las claves de firma de los token.This information includes endpoints, token contents, and token signing keys. Hay un documento de metadatos JSON para cada flujo de usuario en su inquilino B2C.There is a JSON metadata document for each user flow in your B2C tenant. Por ejemplo, el documento de metadatos del flujo de usuario b2c_1_sign_in en fabrikamb2c.onmicrosoft.com se encuentra en:For example, the metadata document for the b2c_1_sign_in user flow in fabrikamb2c.onmicrosoft.com is located at:

https://fabrikamb2c.b2clogin.com/fabrikamb2c.onmicrosoft.com/v2.0/.well-known/openid-configuration?p=b2c_1_sign_in

Una de las propiedades de este documento de configuración es jwks_uri, cuyo valor para el mismo flujo de usuario sería:One of the properties of this configuration document is jwks_uri, whose value for the same user flow would be:

https://fabrikamb2c.b2clogin.com/fabrikamb2c.onmicrosoft.com/discovery/v2.0/keys?p=b2c_1_sign_in.https://fabrikamb2c.b2clogin.com/fabrikamb2c.onmicrosoft.com/discovery/v2.0/keys?p=b2c_1_sign_in.

Para determinar qué flujo de usuario se usó en la firma de un token de identificador (y de dónde se deben obtener los metadatos), tiene dos opciones.To determine which user flow was used in signing an ID token (and from where to get the metadata), you have two options. En primer lugar, el nombre del flujo de usuario se incluye en la notificación acr del token de identificador.First, the user flow name is included in the acr claim in the ID token. La otra opción consiste en codificar el flujo de usuario en el valor del parámetro state al emitir la solicitud y luego descodificarlo para determinar qué flujo de usuario se ha usado.Your other option is to encode the user flow in the value of the state parameter when you issue the request, and then decode it to determine which user flow was used. Cualquiera de estos métodos es válido.Either method is valid.

Cuando haya adquirido el documento de metadatos del punto de conexión de metadatos de OpenID Connect, podrá usar las claves públicas RSA-256 para validar la firma del token de identificador.After you've acquired the metadata document from the OpenID Connect metadata endpoint, you can use the RSA 256 public keys to validate the signature of the ID token. Podría haber varias claves enumeradas en este punto de conexión, cada una identificada con una kid.There might be multiple keys listed at this endpoint, each identified by a kid claim. El encabezado del token de identificador también contiene una notificación kid, que indica cuál de estas claves se usó para firmar el token de identificador.The header of the ID token also contains a kid claim, which indicates which of these keys was used to sign the ID token.

Para comprobar los tokens de Azure AD B2C, debe generar la clave pública mediante el exponente(e) y el módulo(n).To verify the tokens from Azure AD B2C, you need to generate the public key using the exponent(e) and modulus(n). Debe determinar cómo hacerlo con el lenguaje de programación respectivo, según corresponda.You need to determine how to do this in your respective programming language accordingly. La documentación oficial sobre la generación de claves públicas con el protocolo RSA se puede encontrar aquí: https://tools.ietf.org/html/rfc3447#section-3.1.The official documentation on Public Key generation with the RSA protocol can be found here: https://tools.ietf.org/html/rfc3447#section-3.1

Cuando haya validado la firma del token de identificador, deberá verificar varias notificaciones.After you've validated the signature of the ID token, there are several claims that you need to verify. Por ejemplo:For instance:

  • Valide la notificación nonce para evitar ataques de reproducción del token.Validate the nonce claim to prevent token replay attacks. Su valor debería ser el que especificó en la solicitud de inicio de sesión.Its value should be what you specified in the sign-in request.
  • Valide la notificación aud para asegurarse de que se ha generado el token de identificador para su aplicación.Validate the aud claim to ensure that the ID token was issued for your application. Su valor debería ser el identificador de la aplicación.Its value should be the application ID of your application.
  • Valide las notificaciones iat y exp para asegurarse de que el token de identificador no ha expirado.Validate the iat and exp claims to make sure that the ID token hasn't expired.

También hay otras validaciones que deberá llevar a cabo.There are also several more validations that you should perform. Las validaciones se describen en detalle en la especificación de OpenID Connect Core. Podría también querer validar notificaciones adicionales, en función de su escenario.The validations are described in detail in the OpenID Connect Core Spec. You might also want to validate additional claims, depending on your scenario. Algunas validaciones comunes incluyen:Some common validations include:

  • Asegurarse de que la organización o el usuario se han registrado en la aplicación.Ensuring that the user/organization has signed up for the application.
  • Asegurarse de que el usuario tiene la autorización o los privilegios adecuados.Ensuring that the user has proper authorization/privileges.
  • Asegurarse de que se haya producido un determinado nivel de autenticación, como Azure Multi-Factor Authentication.Ensuring that a certain strength of authentication has occurred, such as Azure Multi-Factor Authentication.

Cuando haya validado el token de identificador, podrá iniciar una sesión con el usuario.After you validate the ID token, you can begin a session with the user. Puede usar las notificaciones del token de identificador para obtener información sobre el usuario en la aplicación.You can use the claims in the ID token to obtain information about the user in your application. Entre los usos de esta información se incluye la visualización, los registros y la autorización.Uses for this information include display, records, and authorization.

Obtención de un tokenGet a token

Si necesita que la aplicación web solo ejecute flujos de usuario, puede omitir las siguientes secciones.If you need your web application to only run user flows, you can skip the next few sections. Estas secciones son aplicables solo a las aplicaciones web que necesitan efectuar llamadas autenticadas a una API web y que también están protegidas por Azure AD B2C.These sections are applicable only to web applications that need to make authenticated calls to a web API and are also protected by Azure AD B2C.

Puede canjear el código de autorización que adquirió (mediante response_type=code+id_token) por un token para el recurso deseado; para ello, debe enviar una solicitud POST al punto de conexión /token.You can redeem the authorization code that you acquired (by using response_type=code+id_token) for a token to the desired resource by sending a POST request to the /token endpoint. En Azure AD B2C, puede solicitar tokens de acceso para otras API como de costumbre especificando sus ámbitos en la solicitud.In Azure AD B2C, you can request access tokens for other API's as usual by specifying their scope(s) in the request.

También puede solicitar un token de acceso para su propia API web de back-end de la aplicación mediante la convención del uso del identificador del cliente de la aplicación como el ámbito solicitado (lo que resultará en un token de acceso con ese identificador de cliente como el "público"):You can also request an access token for your app's own back-end Web API by convention of using the app's client ID as the requested scope (which will result in an access token with that client ID as the "audience"):

POST fabrikamb2c.onmicrosoft.com/oauth2/v2.0/token?p=b2c_1_sign_in HTTP/1.1
Host: https://fabrikamb2c.b2clogin.com
Content-Type: application/x-www-form-urlencoded

grant_type=authorization_code&client_id=90c0fe63-bcf2-44d5-8fb7-b8bbc0b29dc6&scope=90c0fe63-bcf2-44d5-8fb7-b8bbc0b29dc6 offline_access&code=AwABAAAAvPM1KaPlrEqdFSBzjqfTGBCmLdgfSTLEMPGYuNHSUYBrq...&redirect_uri=urn:ietf:wg:oauth:2.0:oob&client_secret=<your-application-secret>
ParámetroParameter ObligatorioRequired DESCRIPCIÓNDescription
pp Yes El flujo de usuario usado para adquirir el código de autorización.The user flow that was used to acquire the authorization code. No puede usar un flujo de usuario diferente en esta solicitud.You can't use a different user flow in this request. Agregue este parámetro a la cadena de consulta, no al cuerpo de POST.Add this parameter to the query string, not to the POST body.
client_idclient_id Yes Identificador de aplicación que Azure Portal asignó a la aplicación.The application ID that the Azure portal assigned to your application.
grant_typegrant_type Yes El tipo de concesión, que debe ser authorization_code para el flujo de código de autorización.The type of grant, which must be authorization_code for the authorization code flow.
scopescope SinNo Una lista de ámbitos separada por espacios.A space-separated list of scopes. El ámbito openid indica un permiso para iniciar sesión con el usuario y obtener datos de este en forma de parámetros id_token.The openid scope indicates a permission to sign in the user and get data about the user in the form of id_token parameters. Se puede usar para obtener tokens para la propia API web de back-end de la aplicación, representada por el mismo id. de aplicación que el cliente.It can be used to get tokens to your application's own back-end web API, which is represented by the same application ID as the client. El ámbito offline_access indica que la aplicación necesita un token de actualización para un acceso ampliado a los recursos.The offline_access scope indicates that your application needs a refresh token for extended access to resources.
códigocode Yes El código de autorización que adquirió al principio del flujo de usuario.The authorization code that you acquired in the beginning of the user flow.
redirect_uriredirect_uri Yes El parámetro redirect_uri de la aplicación en la que recibió el código de autorización.The redirect_uri parameter of the application where you received the authorization code.
client_secretclient_secret Yes El secreto de la aplicación se generó en Azure Portal.The application secret that was generated in the Azure portal. El secreto de aplicación es un artefacto de seguridad importante.This application secret is an important security artifact. Debe almacenarlo de forma segura en el servidor.You should store it securely on your server. Cambie este secreto de cliente de forma periódica.Change this client secret on a periodic basis.

Una respuesta correcta del token tiene el siguiente aspecto:A successful token response looks like:

{
    "not_before": "1442340812",
    "token_type": "Bearer",
    "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik5HVEZ2ZEstZnl0aEV1Q...",
    "scope": "90c0fe63-bcf2-44d5-8fb7-b8bbc0b29dc6 offline_access",
    "expires_in": "3600",
    "refresh_token": "AAQfQmvuDy8WtUv-sd0TBwWVQs1rC-Lfxa_NDkLqpg50Cxp5Dxj0VPF1mx2Z...",
}
ParámetroParameter DESCRIPCIÓNDescription
not_beforenot_before Hora a la que el token se considera válido, en tiempo de época.The time at which the token is considered valid, in epoch time.
token_typetoken_type El valor del tipo de token.The token type value. Bearer es el único tipo admitido.Bearer is the only type that is supported.
access_tokenaccess_token El token JWT firmado solicitado.The signed JWT token that you requested.
scopescope Los ámbitos para los que el token es válido.The scopes for which the token is valid.
expires_inexpires_in El período de validez del token de acceso (en segundos).The length of time that the access token is valid (in seconds).
refresh_tokenrefresh_token Un token de actualización de OAuth 2.0.An OAuth 2.0 refresh token. La aplicación puede usar este token para adquirir tokens adicionales una vez que expire el actual.The application can use this token to acquire additional tokens after the current token expires. Los tokens de actualización pueden usarse para conservar el acceso a los recursos durante largos periodos.Refresh tokens can be used to retain access to resources for extended periods of time. El ámbito offline_access debe haberse usado en las solicitudes de token y de autorización para recibir un token de actualización.The scope offline_access must have been used in both the authorization and token requests in order to receive a refresh token.

Las respuestas de error tienen un aspecto similar al siguiente:Error responses look like:

{
    "error": "access_denied",
    "error_description": "The user revoked access to the app.",
}
ParámetroParameter DESCRIPCIÓNDescription
errorerror Un código que puede usarse para clasificar los tipos de errores que se producen.A code that can be used to classify types of errors that occur.
error_descriptionerror_description Un mensaje que puede ayudar a identificar la causa raíz de un error de autenticación.A message that can help identify the root cause of an authentication error.

Uso del tokenUse the token

Ahora que ha adquirido correctamente un token de acceso, puede usar el token en las solicitudes a las API web de back-end incluyéndolo en el encabezado Authorization:Now that you've successfully acquired an access token, you can use the token in requests to your back-end web APIs by including it in the Authorization header:

GET /tasks
Host: https://mytaskwebapi.com
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik5HVEZ2ZEstZnl0aEV1Q...

Actualización del tokenRefresh the token

Los tokens de identificador expiran en un breve período de tiempo.ID tokens expire in a short period of time. Actulice los token cuando expiren para poder seguir accediendo a los recursos.Refresh the tokens after they expire to continue being able to access resources. Puede actualizar un token mediante el envío de otra solicitud POST al punto de conexión /token.You can refresh a token by submitting another POST request to the /token endpoint. Esta vez, proporcione el parámetro refresh_token en lugar del parámetro code:This time, provide the refresh_token parameter instead of the code parameter:

POST fabrikamb2c.onmicrosoft.com/oauth2/v2.0/token?p=b2c_1_sign_in HTTP/1.1
Host: https://fabrikamb2c.b2clogin.com
Content-Type: application/x-www-form-urlencoded

grant_type=refresh_token&client_id=90c0fe63-bcf2-44d5-8fb7-b8bbc0b29dc6&scope=openid offline_access&refresh_token=AwABAAAAvPM1KaPlrEqdFSBzjqfTGBCmLdgfSTLEMPGYuNHSUYBrq...&redirect_uri=urn:ietf:wg:oauth:2.0:oob&client_secret=<your-application-secret>
ParámetroParameter ObligatorioRequired DESCRIPCIÓNDescription
pp Yes El flujo de usuario usado para adquirir el token de actualización original.The user flow that was used to acquire the original refresh token. No puede usar un flujo de usuario diferente en esta solicitud.You can't use a different user flow in this request. Agregue este parámetro a la cadena de consulta, no al cuerpo de POST.Add this parameter to the query string, not to the POST body.
client_idclient_id Yes Identificador de aplicación que Azure Portal asignó a la aplicación.The application ID that the Azure portal assigned to your application.
grant_typegrant_type Yes El tipo de concesión, que debe ser un token de actualización para esta parte del flujo de código de autorización.The type of grant, which must be a refresh token for this part of the authorization code flow.
scopescope SinNo Una lista de ámbitos separada por espacios.A space-separated list of scopes. El ámbito openid indica un permiso para iniciar sesión con el usuario y obtener los datos del usuario en forma de tokens de identificador.The openid scope indicates a permission to sign in the user and get data about the user in the form of ID tokens. Se puede usar para enviar tokens para la propia API web de back-end de la aplicación, representada por el mismo id. de aplicación que el cliente.It can be used to send tokens to your application's own back-end web API, which is represented by the same application ID as the client. El ámbito offline_access indica que la aplicación necesita un token de actualización para un acceso ampliado a los recursos.The offline_access scope indicates that your application needs a refresh token for extended access to resources.
redirect_uriredirect_uri SinNo El parámetro redirect_uri de la aplicación en la que recibió el código de autorización.The redirect_uri parameter of the application where you received the authorization code.
refresh_tokenrefresh_token Yes El token de actualización original que adquirió en la segunda parte del flujo.The original refresh token that was acquired in the second part of the flow. El ámbito offline_access debe usarse en las solicitudes de token y de autorización para recibir un token de actualización.The offline_access scope must be used in both the authorization and token requests in order to receive a refresh token.
client_secretclient_secret Yes El secreto de la aplicación se generó en Azure Portal.The application secret that was generated in the Azure portal. El secreto de aplicación es un artefacto de seguridad importante.This application secret is an important security artifact. Debe almacenarlo de forma segura en el servidor.You should store it securely on your server. Cambie este secreto de cliente de forma periódica.Change this client secret on a periodic basis.

Una respuesta correcta del token tiene el siguiente aspecto:A successful token response looks like:

{
    "not_before": "1442340812",
    "token_type": "Bearer",
    "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik5HVEZ2ZEstZnl0aEV1Q...",
    "scope": "90c0fe63-bcf2-44d5-8fb7-b8bbc0b29dc6 offline_access",
    "expires_in": "3600",
    "refresh_token": "AAQfQmvuDy8WtUv-sd0TBwWVQs1rC-Lfxa_NDkLqpg50Cxp5Dxj0VPF1mx2Z...",
}
ParámetroParameter DESCRIPCIÓNDescription
not_beforenot_before Hora a la que el token se considera válido, en tiempo de época.The time at which the token is considered valid, in epoch time.
token_typetoken_type El valor del tipo de token.The token type value. Bearer es el único tipo admitido.Bearer is the only type that is supported.
access_tokenaccess_token El token JWT firmado que se solicitó.The signed JWT token that was requested.
scopescope El ámbito para el que el token es válido.The scope for which the token is valid.
expires_inexpires_in El período de validez del token de acceso (en segundos).The length of time that the access token is valid (in seconds).
refresh_tokenrefresh_token Un token de actualización de OAuth 2.0.An OAuth 2.0 refresh token. La aplicación puede usar este token para adquirir tokens adicionales una vez que expire el actual.The application can use this token to acquire additional tokens after the current token expires. Los tokens de actualización pueden usarse para conservar el acceso a los recursos durante largos periodos.Refresh tokens can be used to retain access to resources for extended periods of time.

Las respuestas de error tienen un aspecto similar al siguiente:Error responses look like:

{
    "error": "access_denied",
    "error_description": "The user revoked access to the app.",
}
ParámetroParameter DESCRIPCIÓNDescription
errorerror Un código que puede usarse para clasificar los tipos de errores que se producen.A code that can be used to classify types of errors that occur.
error_descriptionerror_description Un mensaje que puede ayudar a identificar la causa raíz de un error de autenticación.A message that can help identify the root cause of an authentication error.

Envío de una solicitud de cierre de sesiónSend a sign-out request

Si desea cerrar la sesión del usuario de la aplicación, no basta con borrar las cookies de la aplicación o finalizar la sesión con el usuario.When you want to sign the user out of the application, it isn't enough to clear the application's cookies or otherwise end the session with the user. Redireccione al usuario a Azure AD B2C para cerrar la sesión. Si no lo hace, el usuario podría autenticarse de nuevo en su aplicación sin volver a escribir sus credenciales.Redirect the user to Azure AD B2C to sign out. If you fail to do so, the user might be able to reauthenticate to your application without entering their credentials again.

Lo que puede hacer es redirigir al usuario al punto de conexión end_session que aparece en el documento de metadatos de OpenID Connect que se ha descrito anteriormente:You can simply redirect the user to the end_session endpoint that is listed in the OpenID Connect metadata document described earlier:

GET https://fabrikamb2c.b2clogin.com/fabrikamb2c.onmicrosoft.com/oauth2/v2.0/logout?
p=b2c_1_sign_in
&post_logout_redirect_uri=https%3A%2F%2Faadb2cplayground.azurewebsites.net%2F
ParámetroParameter ObligatorioRequired DESCRIPCIÓNDescription
pp Yes El flujo de usuario que quiere usar para cerrar la sesión del usuario en la aplicación.The user flow that you want to use to sign the user out of your application.
post_logout_redirect_uripost_logout_redirect_uri SinNo La dirección URL a la que se debe redirigir al usuario después de un cierre de sesión correcto. Si no se incluye, Azure AD B2C mostrará un mensaje genérico al usuario.The URL that the user should be redirected to after successful sign out. If it isn't included, Azure AD B2C shows the user a generic message.

El hecho de dirigir al usuario al punto de conexión end_session borrará algún estado de inicio de sesión único del usuario con Azure AD B2C, pero no se cerrará la sesión del proveedor de identidades social (IDP) del usuario.Directing the user to the end_session endpoint clears some of the user's single sign-on state with Azure AD B2C, but it doesn't sign the user out of their social identity provider (IDP) session. Si el usuario selecciona el mismo IDP durante un inicio de sesión posterior, se volverá a autenticar sin especificar sus credenciales.If the user selects the same IDP during a subsequent sign-in, they are reauthenticated, without entering their credentials. Si un usuario quiere cerrar sesión en su aplicación, eso no significa necesariamente que quiera cerrar sesión en su cuenta de Facebook.If a user wants to sign out of the application, it doesn't necessarily mean they want to sign out of their Facebook account. Sin embargo, si se usan cuentas locales, la sesión del usuario finalizará correctamente.However, if local accounts are used, the user's session ends properly.