# OAuth 2 Authorization Code Flow

![OAuth 2 Authorization Code Flow](/files/-LFLnEzrsukjKk5mlO1F)

1. Le **Client** redirige le **Resource Owner** vers l'**Authorization Server** :

```javascript
https://accounts.google.com/o/oauth2/v2/auth?
response_type=code
&client_id=CLIENT_ID
&redirect_uri=https://cal-tracker.wishtack.io/oauth/callback // optional
&scope=email%20calendar:read
&state=... // state is recommended thus optional 😢
```

* **`client_id`** : ID unique du **Client**.
* **`redirect_uri`** : Une des URLs de retour parmi la liste transmise à l'**Authorization Server** à l'enregistrement. Si le paramètre est absent, l'**Authorization Server** utilisera la valeur par défaut configurée lors de l'enregistrement.
* **`scope`** : liste des autorisations demandées.
* **`state`** : Paramètre malheureusement optionnel permettant au **Client** de retrouver le contexte d'initiation de la demande. Il sert surtout à transmettre un "nonce" *(token aléatoire)* pour des raisons de sécurité.
* Le **Resource Owner** confirme ou rejette les autorisations d’accès demandées sur l’interface proposée par l'**Authorization Server**.
* Le **Client** reçoit l'**Authorization Code** par redirection *(paramètre `code`)* :

```javascript
https://cal-tracker.wishtack.io/oauth/callback?
code=AUTHORIZATION_CODE
&state=...
```

1. Le **Client** peut alors échanger l'**Authorization Code** contre un **Access Token** auprès de l’API OAuth 2 de l'**Authorization Server**.

```javascript
POST https://accounts.google.com/token

client_id=CLIENT_ID
&client_secret=CLIENT_SECRET
&grant_type=authorization_code
&code=AUTHORIZATION_CODE
&redirect_uri=https://cal-tracker.wishtack.io/oauth/callback
```

* **`client_secret`** : Secret du **Client** configuré lors de l'enregistrement.
* En cas de succès, le **Client** reçoit alors l'**Access Token** et un **Refresh Token** optionnel :

```javascript
{
    "access_token": "ACCESS_TOKEN",
    "token_type": "bearer",
    "expires_in": 2592000,
    "refresh_token": "REFRESH_TOKEN",
    "scope": "email,calendar:read",
    "some_user_info":{
        "first_name": "John",
        "last_name": "DOE",
        "email": "j.doe@ibm.com",
        "is_cool": "definitely not!"
    }
}
```

En cas d’expiration de l'**Access Token** et si le **Client** a reçu un **Refresh Token**, le **Client** peut renouveler sa demande avec le **Refresh Token** et obtenir de nouveaux **Access Token** et **Refresh Token**.

L'**Authorization Code** est un code à usage unique dont la durée de vie doit être très courte ***(moins de 10 minutes)***.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://guide-api-rest.marmicode.fr/securite-des-apis-rest/oauth-2/oauth-2-authorization-code-flow.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
