Plateforme d’identités Microsoft et flux d’octroi impliciteMicrosoft identity platform and Implicit grant flow

Le point de terminaison de la plateforme d’identités Microsoft vous permet de connecter des utilisateurs dans vos applications à page unique avec des comptes personnels et professionnels ou scolaires de Microsoft.With the Microsoft identity platform endpoint, you can sign users into your single-page apps with both personal and work or school accounts from Microsoft. Les applications à page unique et autres applications JavaScript qui s’exécutent principalement dans un navigateur présentent des problématiques spécifiques liées à l’authentification :Single-page and other JavaScript apps that run primarily in a browser face a few interesting challenges when it comes to authentication:

  • Les caractéristiques de sécurité de ces applications sont considérablement différentes de celles des applications web traditionnelles basées sur serveur.The security characteristics of these apps are significantly different from traditional server-based web applications.
  • De nombreux serveurs d’autorisation et fournisseurs d’identité ne prennent pas en charge les demandes CORS.Many authorization servers and identity providers do not support CORS requests.
  • Chacune des redirections à partir de l’application du navigateur plein écran perturbe de manière assez importante l’expérience utilisateur.Full page browser redirects away from the app become particularly invasive to the user experience.

Pour ces applications (Angular, Ember.js, React.js, etc.), la plateforme d’identités Microsoft prend en charge le flux d’octroi implicite OAuth 2.0.For these applications (Angular, Ember.js, React.js, and so on), Microsoft identity platform supports the OAuth 2.0 Implicit Grant flow. Le flux implicite est décrit dans la spécification OAuth 2.0.The implicit flow is described in the OAuth 2.0 Specification. Il permet notamment à l’application d’obtenir des jetons de la plateforme d’identités Microsoft sans échanger les informations d’identification du serveur principal.Its primary benefit is that it allows the app to get tokens from Microsoft identity platform without performing a backend server credential exchange. L’application peut alors connecter l’utilisateur, maintenir la session et obtenir des jetons pour d’autres API web, le tout dans le code JavaScript client.This allows the app to sign in the user, maintain session, and get tokens to other web APIs all within the client JavaScript code. Quelques points de sécurité importants sont à prendre en compte lorsque vous utilisez le flux implicite, particulièrement en ce qui concerne l’emprunt d’identité du client et de l’utilisateur.There are a few important security considerations to take into account when using the implicit flow specifically around client and user impersonation.

Cet article explique comment programmer directement par rapport au protocole dans votre application.This article describes how to program directly against the protocol in your application. Dans la mesure du possible, nous vous recommandons d’utiliser les bibliothèques d’authentification Microsoft (MSAL) prises en charge au lieu d’acquérir des jetons et d’appeler des API web sécurisées.When possible, we recommend you use the supported Microsoft Authentication Libraries (MSAL) instead to acquire tokens and call secured web APIs. Jetez également un coup d’œil aux exemples d’applications qui utilisent MSAL.Also take a look at the sample apps that use MSAL.

Toutefois, si vous préférez ne pas utiliser de bibliothèque dans votre application à page unique et envoyer vous-même des messages de protocole, suivez la procédure générale ci-dessous.However, if you prefer not to use a library in your single-page app and send protocol messages yourself, follow the general steps below.

Scénarios adaptés à l’octroi implicite OAuth2Suitable scenarios for the OAuth2 implicit grant

La spécification OAuth2 indique que l’octroi implicite a été conçu pour autoriser les applications d’agent utilisateur, c’est-à-dire les applications JavaScript qui s’exécutent dans un navigateur.The OAuth2 specification declares that the implicit grant has been devised to enable user-agent applications – that is to say, JavaScript applications executing within a browser. La caractéristique déterminante de ces applications réside dans le fait que le code JavaScript est utilisé pour accéder aux ressources du serveur (généralement une API web) et mettre à jour l’expérience utilisateur de l’application en conséquence.The defining characteristic of such applications is that JavaScript code is used for accessing server resources (typically a web API) and for updating the application user experience accordingly. Pensez à des applications comme Gmail ou Outlook Web Access : lorsque vous sélectionnez un message dans votre boîte de réception, seul le volet de visualisation du message change pour afficher la nouvelle sélection, tandis que le reste de la page reste inchangé.Think of applications like Gmail or Outlook Web Access: when you select a message from your inbox, only the message visualization panel changes to display the new selection, while the rest of the page remains unmodified. Cette caractéristique contraste avec les applications web classiques à redirection, pour lesquelles chaque interaction utilisateur entraîne une publication (postback) et un rendu complets de la page de la nouvelle réponse du serveur.This characteristic is in contrast with traditional redirect-based Web apps, where every user interaction results in a full page postback and a full page rendering of the new server response.

Les applications qui adoptent une approche JavaScript extrême sont appelées des applications monopage ou SPA (single-page applications).Applications that take the JavaScript based approach to its extreme are called single-page applications, or SPAs. En d’autres termes, ces applications diffusent uniquement une page HTML initiale et le code JavaScript associé, et toutes les interactions suivantes sont pilotées par des appels d’API Web effectués via JavaScript.The idea is that these applications only serve an initial HTML page and associated JavaScript, with all subsequent interactions being driven by web API calls performed via JavaScript. Toutefois, les approches hybrides, où l’application est principalement basée sur la publication mais effectue des appels JS occasionnels, ne sont pas rares. La discussion sur l’utilisation des flux implicites est également pertinente pour ces approches.However, hybrid approaches, where the application is mostly postback-driven but performs occasional JS calls, are not uncommon – the discussion about implicit flow usage is relevant for those as well.

En général, les applications à redirection sécurisent leurs demandes par des cookies. Mais cette approche présente une efficacité limitée pour les applications JavaScript.Redirect-based applications typically secure their requests via cookies, however, that approach does not work as well for JavaScript applications. Les cookies ne fonctionnent que sur le domaine pour lequel ils ont été générés, tandis que les appels JavaScript peuvent être dirigés vers d’autres domaines.Cookies only work against the domain they have been generated for, while JavaScript calls might be directed toward other domains. En fait, ce sera très souvent le cas : pensez aux applications appelant une API Graph Microsoft, une API Office et une API Azure qui, toutes, résident hors du domaine à partir duquel l’application est exécutée.In fact, that will frequently be the case: think of applications invoking Microsoft Graph API, Office API, Azure API – all residing outside the domain from where the application is served. Une tendance croissante pour les applications JavaScript consiste à n’avoir aucun principal et à se reposer à 100 % sur des API web tierces pour implémenter la fonction métier.A growing trend for JavaScript applications is to have no backend at all, relying 100% on third party web APIs to implement their business function.

Actuellement, la méthode recommandée de protection des appels d’une API Web consiste à utiliser l’approche de jeton de support OAuth2, dans laquelle chaque appel est accompagné d’un jeton d’accès OAuth2.Currently, the preferred method of protecting calls to a web API is to use the OAuth2 bearer token approach, where every call is accompanied by an OAuth2 access token. L’API Web examine le jeton d’accès entrant et, si elle y détecte les périmètres nécessaires, elle autorise l’accès à l’opération demandée.The web API examines the incoming access token and, if it finds in it the necessary scopes, it grants access to the requested operation. Le flux implicite fournit un mécanisme pratique permettant aux applications JavaScript d’obtenir des jetons d’accès pour une API Web, offrant ainsi de nombreux avantages sur les cookies :The implicit flow provides a convenient mechanism for JavaScript applications to obtain access tokens for a web API, offering numerous advantages in respect to cookies:

  • Les jetons peuvent être obtenus de façon fiable sans avoir recours aux appels cross-origin – l’inscription obligatoire de l’URI de redirection vers laquelle les jetons sont retournés garantit que les jetons ne sont pas déplacés.Tokens can be reliably obtained without any need for cross origin calls – mandatory registration of the redirect URI to which tokens are return guarantees that tokens are not displaced
  • Les applications JavaScript peuvent obtenir autant de jetons d’accès que nécessaire, pour un nombre illimité d’API Web ciblées, sans aucune restriction sur les domainesJavaScript applications can obtain as many access tokens as they need, for as many web APIs they target – with no restriction on domains
  • Les fonctionnalités HTML5 comme le stockage de session ou local accordent un contrôle total sur la gestion de la mise en cache et de la durée de vie des jetons, tandis que la gestion des cookies est opaque pour l’application.HTML5 features like session or local storage grant full control over token caching and lifetime management, whereas cookies management is opaque to the app
  • Les jetons d'accès ne sont pas vulnérables aux falsifications de requête intersites (CSRF, Cross Site Request Forgery).Access tokens aren't susceptible to Cross-site request forgery (CSRF) attacks

Le flux d’octroi implicite n’émet pas de jetons d’actualisation, principalement pour des raisons de sécurité.The implicit grant flow does not issue refresh tokens, mostly for security reasons. L'étendue d'un jeton d'actualisation n'est pas aussi étroite que celle des jetons d'accès. Ainsi, un jeton d'actualisation offre une puissance bien supérieure et peut causer des dommages beaucoup plus lourds en cas de fuite. Dans le flux implicite, les jetons sont remis à l’URL. Par conséquent, le risque d’interception est plus élevé qu’avec l’octroi de code d’autorisation.A refresh token isn't as narrowly scoped as access tokens, granting far more power hence inflicting far more damage in case it is leaked out. In the implicit flow, tokens are delivered in the URL, hence the risk of interception is higher than in the authorization code grant.

Toutefois, une application JavaScript a un autre mécanisme à sa disposition pour renouveler les jetons d’accès sans inviter à chaque fois l’utilisateur à entrer ses informations d’identification.However, a JavaScript application has another mechanism at its disposal for renewing access tokens without repeatedly prompting the user for credentials. L’application peut utiliser un IFrame masqué pour effectuer de nouvelles demandes de jeton sur le point de terminaison d’autorisation d’Azure AD : tant que le navigateur a une session active (c’est-à-dire qu’il dispose d’un cookie de session) sur le domaine Azure AD, la demande d’authentification peut s’effectuer correctement sans aucune intervention de l’utilisateur.The application can use a hidden iframe to perform new token requests against the authorization endpoint of Azure AD: as long as the browser still has an active session (read: has a session cookie) against the Azure AD domain, the authentication request can successfully occur without any need for user interaction.

Ce modèle permet à l’application JavaScript de renouveler les jetons d’accès en toute autonomie, voire d’en acquérir d’autres pour une nouvelle API (à condition que l’utilisateur les ait préalablement acceptés).This model grants the JavaScript application the ability to independently renew access tokens and even acquire new ones for a new API (provided that the user previously consented for them). Cela évite les tâches d’acquisition, de maintenance et de protection d’un artefact aussi précieux qu’un jeton d’actualisation.This avoids the added burden of acquiring, maintaining, and protecting a high value artifact such as a refresh token. L’artefact qui permet un renouvellement silencieux, le cookie de session Azure AD, est géré en dehors de l’application.The artifact that makes the silent renewal possible, the Azure AD session cookie, is managed outside of the application. Autre avantage de cette approche : un utilisateur peut se déconnecter d’Azure AD, à l’aide des applications signées dans Azure AD et en cours d’exécution dans les onglets de navigateur.Another advantage of this approach is a user can sign out from Azure AD, using any of the applications signed into Azure AD, running in any of the browser tabs. Cela entraîne la suppression du cookie de session Azure AD, l’application JavaScript perdant automatiquement la capacité de renouveler les jetons pour l’utilisateur déconnecté.This results in the deletion of the Azure AD session cookie, and the JavaScript application will automatically lose the ability to renew tokens for the signed out user.

L’octroi implicite est-il adapté à mon application ?Is the implicit grant suitable for my app?

L’octroi implicite présente plus de risques que d’autres octrois, et les points auxquels vous devez être attentif sont bien documentés (par exemple, Mauvaise utilisation du jeton d’accès pour emprunter l’identité du propriétaire des ressources dans un flux implicite etModèle de menace et considérations de sécurité OAuth 2.0).The implicit grant presents more risks than other grants, and the areas you need to pay attention to are well documented (for example, Misuse of Access Token to Impersonate Resource Owner in Implicit Flow and OAuth 2.0 Threat Model and Security Considerations). Toutefois, le profil de risque supérieur est principalement dû au fait qu’il est destiné à autoriser les applications qui exécutent du code actif, envoyé à un navigateur par une ressource distante.However, the higher risk profile is largely due to the fact that it is meant to enable applications that execute active code, served by a remote resource to a browser. Si vous optez pour une architecture d’application à page unique, que vous n’avez aucun composant principal ou que vous envisagez d’appeler une API Web à l’aide de JavaScript, l’utilisation du flux implicite pour l’acquisition de jeton est recommandée.If you are planning an SPA architecture, have no backend components or intend to invoke a web API via JavaScript, use of the implicit flow for token acquisition is recommended.

Si votre application est un client natif, le flux implicite n'est pas idéal.If your application is a native client, the implicit flow isn't a great fit. L’absence du cookie de session Azure AD dans le contexte d’un client natif empêche votre application de maintenir une session longue.The absence of the Azure AD session cookie in the context of a native client deprives your application from the means of maintaining a long lived session. En d’autres termes, votre application sollicite régulièrement l’utilisateur pour obtenir des jetons d’accès aux nouvelles ressources.Which means your application will repeatedly prompt the user when obtaining access tokens for new resources.

Si vous développez une application web qui comprend un principal et utilise une API à partir de son code principal, le flux implicite n’est pas non plus la solution idéale.If you are developing a Web application that includes a backend, and consuming an API from its backend code, the implicit flow is also not a good fit. D’autres modes d’octroi d’autorisation sont beaucoup plus puissants.Other grants give you far more power. Par exemple, l’octroi d’informations d’identification du client OAuth2 permet d’obtenir des jetons correspondant aux autorisations attribuées à l’application elle-même, et non aux délégations de l’utilisateur.For example, the OAuth2 client credentials grant provides the ability to obtain tokens that reflect the permissions assigned to the application itself, as opposed to user delegations. Le client conserve ainsi l’accès par programmation aux ressources, même lorsqu’un utilisateur n’est pas actif dans une session et ainsi de suite.This means the client has the ability to maintain programmatic access to resources even when a user is not actively engaged in a session, and so on. De plus, ces modes d’octroi offrent de meilleurs gages de sécurité.Not only that, but such grants give higher security guarantees. Par exemple, les jetons d'accès ne transitent jamais par le navigateur de l'utilisateur. Ils ne risquent donc pas d'être enregistrés dans l'historique du navigateur.For instance, access tokens never transit through the user browser, they don't risk being saved in the browser history, and so on. L’application cliente peut également effectuer une authentification forte lorsqu’elle demande un jeton.The client application can also perform strong authentication when requesting a token.

Schéma de protocoleProtocol diagram

Le diagramme suivant montre à quoi ressemble le flux implicite de connexion complet. Les sections qui suivent décrivent chaque étape plus en détail.The following diagram shows what the entire implicit sign-in flow looks like and the sections that follow describe each step in more detail.

Diagramme montrant le flux de connexion implicite

Envoyer la requête de connexionSend the sign-in request

Pour connecter une première fois l’utilisateur à votre application, vous pouvez envoyer une demande d’authentification OpenID Connect et obtenir un jeton id_token à partir du point de terminaison de la plateforme d’identités Microsoft.To initially sign the user into your app, you can send an OpenID Connect authentication request and get an id_token from the Microsoft identity platform endpoint.

Important

Pour demander un jeton d’ID ou d’accès avec succès, le flux d’octroi implicite correspondant à l’inscription d’application sur la page Inscriptions d’applications du Portail Azure doit être activé. Pour ce faire, sélectionnez Jetons d’ID et/ou Jetons d’accès sous la section Octroi implicite.To successfully request an ID token and/or an access token, the app registration in the Azure portal - App registrations page must have the corresponding implicit grant flow enabled, by selecting ID tokens and.or access tokens under the Implicit grant section. S’il n’est pas activé, une erreur unsupported_response est retournée : La valeur fournie pour le paramètre d’entrée 'response_type' n’est pas autorisée pour ce client. La valeur attendue est ’code’If it's not enabled, an unsupported_response error will be returned: The provided value for the input parameter 'response_type' is not allowed for this client. Expected value is 'code'

// Line breaks for legibility only

https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize?
client_id=6731de76-14a6-49ae-97bc-6eba6914391e
&response_type=id_token
&redirect_uri=http%3A%2F%2Flocalhost%2Fmyapp%2F
&scope=openid
&response_mode=fragment
&state=12345
&nonce=678910

Conseil

Pour tester la connexion à l’aide du flux implicite, cliquez sur https://login.microsoftonline.com/common/oauth2/v2.0/authorize... Une fois que vous êtes connecté, votre navigateur doit être redirigé vers https://localhost/myapp/ avec une valeur id_token dans la barre d’adresse.To test signing in using the implicit flow, click https://login.microsoftonline.com/common/oauth2/v2.0/authorize... After signing in, your browser should be redirected to https://localhost/myapp/ with an id_token in the address bar.

ParamètreParameter TypeType DescriptionDescription
tenant Obligatoirerequired La valeur {tenant} dans le chemin d’accès de la requête peut être utilisée pour contrôler les utilisateurs qui peuvent se connecter à l’application.The {tenant} value in the path of the request can be used to control who can sign into the application. Les valeurs autorisées sont common, organizations, consumers et les identificateurs du client.The allowed values are common, organizations, consumers, and tenant identifiers. Pour plus d’informations, consultez les principes de base du protocole.For more detail, see protocol basics.
client_id Obligatoirerequired L’ID (client) d’application attribué à votre application par la page Inscriptions d’applications du portail Azure.The Application (client) ID that the Azure portal - App registrations page assigned to your app.
response_type Obligatoirerequired Doit inclure id_token pour la connexion à OpenID Connect.Must include id_token for OpenID Connect sign-in. Il peut également inclure l’élément response_type token.It may also include the response_type token. L’utilisation de l’élément token permet ici à votre application de recevoir immédiatement un jeton d’accès à partir du point de terminaison d’autorisation sans avoir à exécuter une deuxième requête sur le point de terminaison d’autorisation.Using token here will allow your app to receive an access token immediately from the authorize endpoint without having to make a second request to the authorize endpoint. Si vous utilisez l’élément response_type token, le paramètre scope doit contenir une étendue indiquant la ressource pour laquelle le jeton doit être émis (par exemple, user.read sur Microsoft Graph).If you use the token response_type, the scope parameter must contain a scope indicating which resource to issue the token for (for example, user.read on Microsoft Graph).
redirect_uri recommandérecommended L’URI de redirection de votre application, vers lequel votre application peut envoyer et recevoir des réponses d’authentification.The redirect_uri of your app, where authentication responses can be sent and received by your app. Il doit correspondre exactement à l’un des URI de redirection enregistrés dans le portail, auquel s’ajoute le codage dans une URL.It must exactly match one of the redirect_uris you registered in the portal, except it must be url encoded.
scope Obligatoirerequired Une liste d’étendues séparées par des espaces.A space-separated list of scopes. Pour OpenID Connect (id_tokens), vous devez inclure l’étendue openid, qui correspond à l’autorisation de connexion dans l’interface utilisateur de consentement.For OpenID Connect (id_tokens), it must include the scope openid, which translates to the "Sign you in" permission in the consent UI. Vous pouvez également inclure les étendues email et profile permettant d’accéder à des données utilisateur supplémentaires.Optionally you may also want to include the email and profile scopes for gaining access to additional user data. Vous pouvez aussi inclure d’autres étendues dans cette requête pour solliciter le consentement sur diverses ressources, si un jeton d’accès est demandé.You may also include other scopes in this request for requesting consent to various resources, if an access token is requested.
response_mode facultatifoptional Spécifie la méthode à utiliser pour envoyer le jeton résultant à votre application.Specifies the method that should be used to send the resulting token back to your app. Par défaut demande simplement un jeton d’accès, mais fragmente si la requête inclut un jeton id_token.Defaults to query for just an access token, but fragment if the request includes an id_token.
state recommandérecommended Une valeur incluse dans la requête, qui sera également renvoyée dans la réponse de jeton.A value included in the request that will also be returned in the token response. Il peut s’agir d’une chaîne du contenu de votre choix.It can be a string of any content that you wish. Une valeur unique générée de manière aléatoire est généralement utilisée pour empêcher les falsifications de requête intersite.A randomly generated unique value is typically used for preventing cross-site request forgery attacks. La valeur d’état est également utilisée pour coder les informations sur l’état de l’utilisateur dans l’application avant la requête d’authentification, comme la page ou l’écran sur lequel ou laquelle il était positionné.The state is also used to encode information about the user's state in the app before the authentication request occurred, such as the page or view they were on.
nonce Obligatoirerequired Une valeur incluse dans la requête, générée par l’application, qui sera intégrée dans le jeton id_token résultant en tant que revendication.A value included in the request, generated by the app, that will be included in the resulting id_token as a claim. L’application peut ensuite vérifier cette valeur afin de contrer les attaques par relecture de jetons.The app can then verify this value to mitigate token replay attacks. La valeur est généralement une valeur unique, aléatoire pouvant être utilisé pour identifier l’origine de la requête.The value is typically a randomized, unique string that can be used to identify the origin of the request. Nécessaire uniquement lorsqu’un jeton id_token est demandé.Only required when an id_token is requested.
prompt facultatifoptional Indique le type d’interaction utilisateur requis.Indicates the type of user interaction that is required. Les seules valeurs valides pour l’instant sont « login », « none », « select_account » et « consent ».The only valid values at this time are 'login', 'none', 'select_account', and 'consent'. prompt=login oblige l'utilisateur à saisir ses informations d'identification lors de cette requête, annulant de fait l'authentification unique.prompt=login will force the user to enter their credentials on that request, negating single-sign on. Avec prompt=none, c’est le comportement inverse. Cette valeur vous garantit qu’aucune invite interactive d’aucune sorte n’est présentée à l’utilisateur.prompt=none is the opposite - it will ensure that the user isn't presented with any interactive prompt whatsoever. Si la demande ne peut pas être exécutée en mode silencieux au moyen d’une authentification unique, le point de terminaison de la plateforme d’identités Microsoft renvoie une erreur.If the request can't be completed silently via single-sign on, the Microsoft identity platform endpoint will return an error. prompt=select_account envoie l’utilisateur vers un sélecteur de compte dans lequel tous les comptes mémorisés dans la session seront affichés.prompt=select_account sends the user to an account picker where all of the accounts remembered in the session will appear. prompt=consent déclenche l’affichage de la boîte de dialogue de consentement OAuth après la connexion de l’utilisateur, afin de lui demander d’octroyer des autorisations à l’application.prompt=consent will trigger the OAuth consent dialog after the user signs in, asking the user to grant permissions to the app.
login_hint facultatifoptional Peut être utilisé pour remplir au préalable le champ réservé au nom d’utilisateur/à l’adresse électronique de la page de connexion de l’utilisateur si vous connaissez déjà son nom d’utilisateur.Can be used to pre-fill the username/email address field of the sign in page for the user, if you know their username ahead of time. Les applications utilisent souvent ce paramètre au cours de la réauthentification, après avoir extrait le nom d’utilisateur à partir d’une connexion précédente à l’aide de la revendication preferred_username.Often apps will use this parameter during re-authentication, having already extracted the username from a previous sign-in using the preferred_username claim.
domain_hint facultatifoptional S’il est inclus, ce paramètre ignore le processus de découverte par e-mail auquel l’utilisateur doit se soumettre sur la page de connexion, ce qui améliore légèrement l’expérience utilisateur.If included, it will skip the email-based discovery process that user goes through on the sign in page, leading to a slightly more streamlined user experience. Cela est couramment utilisé pour les applications métier qui fonctionnent dans un locataire unique, où elles fournissent un nom de domaine au sein d’un locataire donné.This is commonly used for Line of Business apps that operate in a single tenant, where they will provide a domain name within a given tenant. L’utilisateur est transféré vers le fournisseur de fédération pour ce locataire.This will forward the user to the federation provider for that tenant. Notez que cela empêchera les invités de se connecter à cette application.Note that this will prevent guests from signing into this application.

À ce stade, l’utilisateur est invité à saisir ses informations d’identification et à exécuter l’authentification.At this point, the user will be asked to enter their credentials and complete the authentication. Le point de terminaison de la plateforme d’identités Microsoft s’assure également que l’utilisateur a accepté les autorisations indiquées dans le paramètre de requête scope.The Microsoft identity platform endpoint will also ensure that the user has consented to the permissions indicated in the scope query parameter. Si l’utilisateur n’a accepté aucune de ces autorisations, il lui demande de corriger ce manquement.If the user has consented to none of those permissions, it will ask the user to consent to the required permissions. Pour plus d’informations, consultez Autorisations, consentement et applications multi-locataires.For more info, see permissions, consent, and multi-tenant apps.

Une fois que l’utilisateur a procédé à l’authentification et accordé son consentement, le point de terminaison de la plateforme d’identités Microsoft renvoie une réponse à votre application à l’URI redirect_uri indiqué à l’aide de la méthode spécifiée dans le paramètre response_mode.Once the user authenticates and grants consent, the Microsoft identity platform endpoint will return a response to your app at the indicated redirect_uri, using the method specified in the response_mode parameter.

Réponse correcteSuccessful response

Une réponse correcte utilisant response_mode=fragment et response_type=id_token+token ressemble à ceci (des sauts de ligne sont ici insérés pour une meilleure lisibilité) :A successful response using response_mode=fragment and response_type=id_token+token looks like the following (with line breaks for legibility):

GET https://localhost/myapp/#
&token_type=Bearer
&expires_in=3599
&id_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik5HVEZ2ZEstZnl0aEV1Q...
&state=12345
ParamètreParameter DescriptionDescription
access_token Inclus si response_type inclut token.Included if response_type includes token. Le jeton d'accès que l’application a demandé.The access token that the app requested. Le jeton d’accès ne doit pas être décodé ou inspecté ; il doit être traité comme une chaîne opaque.The access token shouldn't be decoded or otherwise inspected, it should be treated as an opaque string.
token_type Inclus si response_type inclut token.Included if response_type includes token. Sera toujours Bearer.Will always be Bearer.
expires_in Inclus si response_type inclut token.Included if response_type includes token. Indique, en secondes, la durée de validité du jeton pour la mise en cache.Indicates the number of seconds the token is valid, for caching purposes.
scope Inclus si response_type inclut token.Included if response_type includes token. Indique la ou les étendues pour lesquelles le jeton access_token sera valide.Indicates the scope(s) for which the access_token will be valid. Peut ne pas inclure toutes les étendues demandées, si elles n’étaient pas applicables à l’utilisateur (dans le cas des étendues spécifiques à Azure AD demandées au moment de la connexion avec un compte personnel).May not include all of the scopes requested, if they were not applicable to the user (in the case of Azure AD-only scopes being requested when a personal account is used to log in).
id_token Un jeton Web JSON signé (JWT).A signed JSON Web Token (JWT). L’application peut décoder les segments de ce jeton, afin de demander des informations relatives à l’utilisateur qui s’est connecté.The app can decode the segments of this token to request information about the user who signed in. L’application peut mettre en cache les valeurs et les afficher, mais elle ne peut pas les utiliser pour les limites d’autorisation ou de sécurité.The app can cache the values and display them, but it shouldn't rely on them for any authorization or security boundaries. Pour en savoir plus sur id_tokens, consultez id_token reference.For more information about id_tokens, see the id_token reference.
Remarque : Fourni uniquement si l’étendue openid a été demandée.Note: Only provided if openid scope was requested.
state Si un paramètre d’état est inclus dans la demande, la même valeur doit apparaître dans la réponse.If a state parameter is included in the request, the same value should appear in the response. L’application doit vérifier que les valeurs d’état de la demande et de la réponse sont identiques.The app should verify that the state values in the request and response are identical.

Réponse d’erreurError response

Les réponses d’erreur peuvent également être envoyées à l’élément redirect_uri , de manière à ce que l’application puisse les traiter de manière appropriée :Error responses may also be sent to the redirect_uri so the app can handle them appropriately:

GET https://localhost/myapp/#
error=access_denied
&error_description=the+user+canceled+the+authentication
ParamètreParameter DescriptionDescription
error Une chaîne de code d’erreur pouvant être utilisée pour classer les types d’erreurs se produisant, et pouvant être utilisée pour intervenir face aux erreurs.An error code string that can be used to classify types of errors that occur, and can be used to react to errors.
error_description Un message d’erreur spécifique qui peut aider un développeur à identifier la cause principale d’une erreur d’authentification.A specific error message that can help a developer identify the root cause of an authentication error.

Obtention des jetons d’accès en mode silencieux en arrière-planGetting access tokens silently in the background

Maintenant que vous avez connecté l’utilisateur dans votre application à page unique, vous pouvez obtenir silencieusement des jetons d’accès destinés à appeler des API web sécurisées à l’aide de la plateforme d’identités Microsoft, comme Microsoft Graph.Now that you've signed the user into your single-page app, you can silently get access tokens for calling web APIs secured by Microsoft identity platform, such as the Microsoft Graph. Même si vous avez déjà reçu un jeton utilisant l’élément response_type token, vous pouvez utiliser cette méthode pour acquérir des jetons vers des ressources supplémentaires sans avoir à demander à l’utilisateur de se reconnecter.Even if you already received a token using the token response_type, you can use this method to acquire tokens to additional resources without having to redirect the user to sign in again.

Dans le flux normal OpenID Connect/OAuth, il vous faut transmettre une demande au point de terminaison /token de la plateforme d’identités Microsoft.In the normal OpenID Connect/OAuth flow, you would do this by making a request to the Microsoft identity platform /token endpoint. Toutefois, le point de terminaison de la plateforme d’identités Microsoft ne prend pas en charge les demandes CORS. Il est donc hors de question d’effectuer des appels AJAX afin d’obtenir et d’actualiser des jetons.However, the Microsoft identity platform endpoint does not support CORS requests, so making AJAX calls to get and refresh tokens is out of the question. Au lieu de cela, vous pouvez utiliser le flux implicite d’un iFrame masqué afin d’obtenir de nouveaux jetons pour d’autres API web :Instead, you can use the implicit flow in a hidden iframe to get new tokens for other web APIs:

// Line breaks for legibility only

https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize?
client_id=6731de76-14a6-49ae-97bc-6eba6914391e
&response_type=token
&redirect_uri=http%3A%2F%2Flocalhost%2Fmyapp%2F
&scope=https%3A%2F%2Fgraph.microsoft.com%2Fuser.read
&response_mode=fragment
&state=12345
&nonce=678910
&prompt=none
&login_hint=myuser@mycompany.com

Pour plus d’informations sur les paramètres de requête dans l’URL, consultez Envoyer la requête de connexion.For details on the query parameters in the URL, see send the sign in request.

Conseil

Essayez de copier et coller la requête ci-dessous dans un onglet de navigateur !Try copy & pasting the below request into a browser tab! (N'oubliez pas de remplacer les valeurs login_hint par la valeur correcte pour votre utilisateur)(Don't forget to replace the login_hint values with the correct value for your user)

https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=6731de76-14a6-49ae-97bc-6eba6914391e&response_type=token&redirect_uri=http%3A%2F%2Flocalhost%2Fmyapp%2F&scope=https%3A%2F%2Fgraph.microsoft.com%2Fuser.read&response_mode=fragment&state=12345&nonce=678910&prompt=none&login_hint={your-username}

Grâce au paramètre prompt=none , cette requête va immédiatement réussir ou échouer, avant de revenir vers votre application.Thanks to the prompt=none parameter, this request will either succeed or fail immediately and return to your application. Une réponse correcte sera envoyée à votre application, à l’redirect_uri indiqué, à l’aide de la méthode spécifiée dans le paramètre response_mode.A successful response will be sent to your app at the indicated redirect_uri, using the method specified in the response_mode parameter.

Réponse correcteSuccessful response

Une réponse correcte utilisant response_mode=fragment se présente ainsi :A successful response using response_mode=fragment looks like:

GET https://localhost/myapp/#
access_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik5HVEZ2ZEstZnl0aEV1Q...
&state=12345
&token_type=Bearer
&expires_in=3599
&scope=https%3A%2F%2Fgraph.microsoft.com%2Fdirectory.read
ParamètreParameter DescriptionDescription
access_token Inclus si response_type inclut token.Included if response_type includes token. Jeton d’accès demandé par l’application, dans ce cas Microsoft Graph.The access token that the app requested, in this case for the Microsoft Graph. Le jeton d’accès ne doit pas être décodé ou inspecté ; il doit être traité comme une chaîne opaque.The access token shouldn't be decoded or otherwise inspected, it should be treated as an opaque string.
token_type Sera toujours Bearer.Will always be Bearer.
expires_in Indique, en secondes, la durée de validité du jeton pour la mise en cache.Indicates the number of seconds the token is valid, for caching purposes.
scope Indique la ou les étendues pour lesquelles le jeton access_token sera valide.Indicates the scope(s) for which the access_token will be valid. Peut ne pas inclure toutes les étendues demandées, si elles n’étaient pas applicables à l’utilisateur (dans le cas des étendues spécifiques à Azure AD demandées au moment de la connexion avec un compte personnel).May not include all of the scopes requested, if they were not applicable to the user (in the case of Azure AD-only scopes being requested when a personal account is used to log in).
id_token Un jeton Web JSON signé (JWT).A signed JSON Web Token (JWT). Inclus si response_type inclut id_token.Included if response_type includes id_token. L’application peut décoder les segments de ce jeton, afin de demander des informations relatives à l’utilisateur qui s’est connecté.The app can decode the segments of this token to request information about the user who signed in. L’application peut mettre en cache les valeurs et les afficher, mais elle ne peut pas les utiliser pour les limites d’autorisation ou de sécurité.The app can cache the values and display them, but it shouldn't rely on them for any authorization or security boundaries. Pour en savoir plus sur id_tokens, consultez le document de id_tokenréférence.For more information about id_tokens, see the id_token reference.
Remarque : Fourni uniquement si l’étendue openid a été demandée.Note: Only provided if openid scope was requested.
state Si un paramètre d’état est inclus dans la demande, la même valeur doit apparaître dans la réponse.If a state parameter is included in the request, the same value should appear in the response. L’application doit vérifier que les valeurs d’état de la demande et de la réponse sont identiques.The app should verify that the state values in the request and response are identical.

Réponse d’erreurError response

Les réponses d’erreur peuvent également être envoyées à l’élément redirect_uri , de manière à ce que l’application puisse les traiter de manière appropriée.Error responses may also be sent to the redirect_uri so the app can handle them appropriately. Dans le cas de prompt=none, une erreur se présentera généralement ainsi :In the case of prompt=none, an expected error will be:

GET https://localhost/myapp/#
error=user_authentication_required
&error_description=the+request+could+not+be+completed+silently
ParamètreParameter DescriptionDescription
error Une chaîne de code d’erreur pouvant être utilisée pour classer les types d’erreurs se produisant, et pouvant être utilisée pour intervenir face aux erreurs.An error code string that can be used to classify types of errors that occur, and can be used to react to errors.
error_description Un message d’erreur spécifique qui peut aider un développeur à identifier la cause principale d’une erreur d’authentification.A specific error message that can help a developer identify the root cause of an authentication error.

Si vous recevez cette erreur dans la requête iFrame, l’utilisateur doit se connecter de nouveau de manière interactive, ceci pour récupérer un nouveau jeton.If you receive this error in the iframe request, the user must interactively sign in again to retrieve a new token. Vous êtes invité à gérer ce cas de la manière la plus appropriée pour votre application.You can choose to handle this case in whatever way makes sense for your application.

Actualisation des jetonsRefreshing tokens

L’octroi implicite ne fournit pas de jetons d’actualisation.The implicit grant does not provide refresh tokens. Les id_token et les access_token expirant après une courte période, votre application doit être préparée à les actualiser de manière régulière.Both id_tokens and access_tokens will expire after a short period of time, so your app must be prepared to refresh these tokens periodically. Pour actualiser chaque type de jeton, vous pouvez exécuter la demande iFrame masquée ci-dessus à l’aide du paramètre prompt=none afin de contrôler le comportement de la plateforme d’identités.To refresh either type of token, you can perform the same hidden iframe request from above using the prompt=none parameter to control the identity platform's behavior. Si vous souhaitez recevoir un nouvel élément id_token, veillez à utiliser id_token dans le response_type et le scope=openid, ainsi qu’un paramètre nonce.If you want to receive a new id_token, be sure to use id_token in the response_type and scope=openid, as well as a nonce parameter.

Envoi d’une demande de déconnexionSend a sign out request

L’élément end_session_endpoint OpenID Connect permet à votre application d’envoyer une demande au point de terminaison de la plateforme d’identités Microsoft pour mettre fin à la session d’un utilisateur et effacer les cookies définis par le point de terminaison de la plateforme d’identités Microsoft.The OpenID Connect end_session_endpoint allows your app to send a request to the Microsoft identity platform endpoint to end a user's session and clear cookies set by the Microsoft identity platform endpoint. Pour déconnecter complètement un utilisateur d’une application web, votre application doit mettre fin à sa propre session avec l’utilisateur (généralement en vidant un cache de jeton ou en supprimant les cookies), puis rediriger le navigateur vers :To fully sign a user out of a web application, your app should end its own session with the user (usually by clearing a token cache or dropping cookies), and then redirect the browser to:

https://login.microsoftonline.com/{tenant}/oauth2/v2.0/logout?post_logout_redirect_uri=https://localhost/myapp/
ParamètreParameter TypeType DescriptionDescription
tenant Obligatoirerequired La valeur {tenant} dans le chemin d’accès de la requête peut être utilisée pour contrôler les utilisateurs qui peuvent se connecter à l’application.The {tenant} value in the path of the request can be used to control who can sign into the application. Les valeurs autorisées sont common, organizations, consumers et les identificateurs du client.The allowed values are common, organizations, consumers, and tenant identifiers. Pour plus d’informations, consultez les principes de base du protocole.For more detail, see protocol basics.
post_logout_redirect_uri recommandérecommended URL vers laquelle l’utilisateur doit être redirigé après la déconnexion.The URL that the user should be returned to after logout completes. Cette valeur doit correspondre à l’un des URI de redirection inscrits pour l’application.This value must match one of the redirect URIs registered for the application. Si elle n’est pas incluse, le point de terminaison de la plateforme d’identités Microsoft affiche un message générique.If not included, the user will be shown a generic message by the Microsoft identity platform endpoint.

Étapes suivantesNext steps