> ## Documentation Index
> Fetch the complete documentation index at: https://generaltranslation.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Comment se connecter aux points de terminaison à l'aide du flux de code d’autorisation OAuth 2.0 avec PKCE

<div id="how-to-connect-to-endpoints-using-oauth-20-authorization-code-flow-with-pkce">
  ### Comment se connecter aux points de terminaison à l’aide du flux de code d’autorisation OAuth 2.0 avec PKCE
</div>

<div id="how-to-connect-to-the-endpoints">
  #### Comment se connecter aux endpoints
</div>

Pour authentifier vos utilisateurs, votre App doit implémenter un flux d’autorisation. Ce flux d’autorisation vous permet de rediriger vos utilisateurs vers une boîte de dialogue d’autorisation sur X. À partir de là, l’interface principale de X affichera cette boîte de dialogue et gérera l’autorisation pour le compte de votre App. Vos utilisateurs pourront autoriser votre App ou refuser l’autorisation. Une fois leur choix effectué, X les redirigera vers votre App, où vous pourrez échanger le code d’autorisation contre un jeton d’accès (si l’utilisateur a autorisé votre App) ou gérer un refus (si l’utilisateur ne l’a pas autorisée).

<div id="working-with-confidential-clients">
  #### Utilisation de clients confidentiels
</div>

Si vous travaillez avec des clients confidentiels, vous devrez utiliser un schéma d’[authentification Basic](https://datatracker.ietf.org/doc/html/rfc2617#section-2) pour générer un en-tête d’autorisation avec encodage base64 lors de l’envoi de requêtes aux endpoints de jeton.

Les champs `userid` et `password` sont séparés par un seul caractère deux-points (":") dans une chaîne encodée en base64 au sein des identifiants.

Un exemple ressemblerait à ceci :

`-header 'Authorization: Basic V1ROclFTMTRiVWhwTWw4M2FVNWFkVGQyTldNNk1UcGphUTotUm9LeDN4NThKQThTbTlKSXQyZm1BanEzcTVHWC1icVozdmpKeFNlR3NkbUd0WEViUA=='`

Si le user agent souhaite envoyer le Client ID « Aladdin » et le mot de passe « open sesame », il utiliserait l’en-tête suivant :

`Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==`

Pour créer l’en-tête d’autorisation de type Basic, vous devrez appliquer un encodage base64 à votre Client ID et votre Client Secret, qui peuvent être obtenus à partir de la page « Keys and Tokens » de votre App dans la [Console de développement.](https://developer.x.com/en/portal/dashboard)

<div id="steps-to-connect-using-oauth-20">
  #### Étapes pour se connecter avec OAuth 2.0
</div>

**Étape 1 : Construire une URL d’autorisation**

Votre App doit construire une URL d’autorisation vers X, en indiquant les autorisations (scopes) dont votre App a besoin. Par exemple, si votre App doit rechercher des Tweets, des utilisateurs et gérer les abonnements (follows), elle doit demander les scopes suivants :

`tweet.read%20users.read%20follows.read%20follows.write`

L’URL contient également les paramètres `code_challenge` et `state`, en plus des autres paramètres requis. En production, vous devez utiliser une chaîne aléatoire pour le `code_challenge`.

**Étape 2 : GET oauth2/authorize**

Demandez à l’utilisateur de s’authentifier, ce qui enverra à l’application un code d’autorisation. Si vous avez activé OAuth 2.0 pour votre App, vous pouvez trouver votre Client ID dans la page « Keys and Tokens » de votre App.

Un exemple d’URL vers laquelle rediriger l’utilisateur ressemblerait à ceci :

```
https://x.com/i/oauth2/authorize?response_type=code&client_id=M1M5R3BMVy13QmpScXkzTUt5OE46MTpjaQ&redirect_uri=https://www.example.com&scope=tweet.read%20users.read%20follows.read%20follows.write&state=state&code_challenge=challenge&code_challenge_method=plain
```

Voici à quoi ressemblerait une URL d’exemple avec offline\_access :

```
https://x.com/i/oauth2/authorize?response_type=code&client_id=M1M5R3BMVy13QmpScXkzTUt5OE46MTpjaQ&redirect_uri=https://www.example.com&scope=tweet.read%20users.read%20follows.read%20offline.access&state=state&code_challenge=challenge&code_challenge_method=plain
```

Une fois l’authentification réussie, au niveau du redirect\_uri vous recevrez une requête contenant le paramètre auth\_code. Votre application doit vérifier le paramètre state.

Un exemple de requête provenant de la redirection du client serait :

```
https://www.example.com/?state=state&code=VGNibzFWSWREZm01bjN1N3dicWlNUG1oa2xRRVNNdmVHelJGY2hPWGxNd2dxOjE2MjIxNjA4MjU4MjU6MToxOmFjOjE
```

**Étape 3 : POST oauth2/token - Jeton d’accès**

À ce stade, vous pouvez utiliser le code d’autorisation pour créer un jeton d’accès et un jeton d’actualisation (uniquement si le scope `offline.access` est demandé). Vous pouvez effectuer une requête POST vers le point de terminaison suivant :

```
https://api.x.com/2/oauth2/token
```

Vous devrez envoyer le `Content-Type` de `application/x-www-form-urlencoded` dans un en-tête. De plus, votre requête doit inclure : `code`, `grant_type`, `client_id` et `redirect_uri`, ainsi que le `code_verifier`.

Voici un exemple de requête de jeton pour un client public :

```json theme={null}
curl --location --request POST 'https://api.x.com/2/oauth2/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'code=VGNibzFWSWREZm01bjN1N3dicWlNUG1oa2xRRVNNdmVHelJGY2hPWGxNd2dxOjE2MjIxNjA4MjU4MjU6MToxOmFjOjE' \
--data-urlencode 'grant_type=authorization_code' \
--data-urlencode 'client_id=rG9n6402A3dbUJKzXTNX4oWHJ' \
--data-urlencode 'redirect_uri=https://www.example.com' \
--data-urlencode 'code_verifier=challenge'
```

Voici un exemple avec un client confidentiel :

```json theme={null}
curl --location --request POST 'https://api.x.com/2/oauth2/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'Authorization: Basic V1ROclFTMTRiVWhwTWw4M2FVNWFkVGQyTldNNk1UcGphUTotUm9LeDN4NThKQThTbTlKSXQyZm1BanEzcTVHWC1icVozdmpKeFNlR3NkbUd0WEViUA=='\
--data-urlencode 'code=VGNibzFWSWREZm01bjN1N3dicWlNUG1oa2xRRVNNdmVHelJGY2hPWGxNd2dxOjE2MjIxNjA4MjU4MjU6MToxOmFjOjE' \
--data-urlencode 'grant_type=authorization_code' \
--data-urlencode 'redirect_uri=https://www.example.com' \
--data-urlencode 'code_verifier=challenge'
```

**Étape 4 : Se connecter aux API**

Vous êtes maintenant prêt à vous connecter aux endpoints en utilisant OAuth 2.0. Pour ce faire, vous effectuerez la requête API comme vous le feriez avec l’[authentification par Jeton Bearer](/fr/resources/fundamentals/authentication/oauth-2-0/application-only). Au lieu d’envoyer votre Jeton Bearer, vous devrez utiliser le jeton d’accès que vous avez généré à l’étape précédente. En réponse, vous devriez voir le payload approprié correspondant à l’endpoint que vous ciblez. Cette requête est la même pour les clients publics et confidentiels. 

Voici à quoi pourrait ressembler un exemple de requête :

```json theme={null}
curl --location --request GET 'https://api.x.com/2/tweets?ids=1261326399320715264,1278347468690915330' \
--header 'Authorization: Bearer Q0Mzb0VhZ0V5dmNXSTEyNER2MFNfVW50RzdXdTN6STFxQlVkTGhTc1lCdlBiOjE2MjIxNDc3NDM5MTQ6MToxOmF0OjE'
```

**Étape 5 : POST oauth2/token - refresh token**

Un refresh token permet à une application d’obtenir un nouvel access token sans solliciter l’utilisateur. Vous pouvez créer un refresh token en effectuant une requête POST vers l’endpoint suivant : [https://api.x.com/2/oauth2/token](https://api.x.com/2/oauth2/token). Vous devrez ajouter le `Content-Type` `application/x-www-form-urlencoded` dans un en-tête. En outre, vous devrez aussi transmettre votre refresh\_token, définir votre grant\_type sur `refresh_token`, et définir votre `client_id`.

Cette requête fonctionnera pour les clients publics :

```json theme={null}
POST 'https://api.x.com/2/oauth2/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'refresh_token=bWRWa3gzdnk3WHRGU1o0bmRRcTJ5VUxWX1lZTDdJSUtmaWcxbTVxdEFXcW5tOjE2MjIxNDc3NDM5MTQ6MToxOnJ0OjE' \
--data-urlencode 'grant_type=refresh_token' \
--data-urlencode 'client_id=rG9n6402A3dbUJKzXTNX4oWHJ'
```

Voici un exemple pour un client confidentiel :

```json theme={null}
POST 'https://api.x.com/2/oauth2/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'Authorization: Basic V1ROclFTMTRiVWhwTWw4M2FVNWFkVGQyTldNNk1UcGphUTotUm9LeDN4NThKQThTbTlKSXQyZm1BanEzcTVHWC1icVozdmpKeFNlR3NkbUd0WEViUA=='\
--data-urlencode 'refresh_token=bWRWa3gzdnk3WHRGU1o0bmRRcTJ5VUxWX1lZTDdJSUtmaWcxbTVxdEFXcW5tOjE2MjIxNDc3NDM5MTQ6MToxOnJ0OjE'\
--data-urlencode 'grant_type=refresh_token'
```

**Étape 6 : POST oauth2/revoke - Révoquer le jeton**

Un jeton de révocation invalide un jeton d’accès ou un jeton d’actualisation. Il permet de proposer une fonctionnalité de « déconnexion » dans les clients, afin de supprimer toutes les informations d’identification de sécurité associées au flux d’autorisation qui pourraient ne plus être nécessaires. Le jeton de révocation est destiné à une App qui révoque un jeton, et non à un utilisateur. Vous pouvez créer une requête de révocation de jeton en envoyant une requête POST à l’URL suivante si l’App souhaite révoquer par programmation l’accès qui lui a été accordé :

```
https://api.x.com/2/oauth2/revoke
```

Vous devrez transmettre le `Content-Type` de `application/x-www-form-urlencoded` via un en-tête, ainsi que votre jeton et votre client\_id.

Dans certains cas, un utilisateur peut souhaiter révoquer l’accès qu’il a accordé à une App ; il peut révoquer cet accès en se rendant sur la [page des Apps connectées](https://x.com/settings/connected_apps).

```bash theme={null}
curl --location --request POST 'https://api.x.com/2/oauth2/revoke' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'token=Q0Mzb0VhZ0V5dmNXSTEyNER2MFNfVW50RzdXdTN6STFxQlVkTGhTc1lCdlBiOjE2MjIxNDc3NDM5MTQ6MToxOmF0OjE' \
--data-urlencode 'client_id=rG9n6402A3dbUJKzXTNX4oWHJ'
```

Cette requête fonctionnera pour les clients confidentiels :

```bash theme={null}
curl --location --request POST 'https://api.x.com/2/oauth2/revoke' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'Authorization: Basic V1ROclFTMTRiVWhwTWw4M2FVNWFkVGQyTldNNk1UcGphUTotUm9LeDN4NThKQThTbTlKSXQyZm1BanEzcTVHWC1icVozdmpKeFNlR3NkbUd0WEViUA=='\
--data-urlencode 'token=Q0Mzb0VhZ0V5dmNXSTEyNER2MFNfVW50RzdXdTN6STFxQlVkTGhTc1lCdlBiOjE2MjIxNDc3NDM5MTQ6MToxOmF0OjE'
```
