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

# flux d’autorisation par code

> Utilisez le flux de code d’autorisation OAuth 2.0 avec PKCE pour authentifier les utilisateurs auprès d’ABBYY Vantage et obtenir des jetons d’accès pour l’API Vantage.

export const VantageRegion = ({children}) => {
  const STORAGE_KEY = "abbyy.vantage.region";
  const REGIONS = [{
    code: "eu",
    label: "Europe"
  }, {
    code: "us",
    label: "North America"
  }, {
    code: "au",
    label: "Australia / Asia-Pacific"
  }];
  const [region, setRegion] = useState("eu");
  const [open, setOpen] = useState(false);
  const containerRef = useRef(null);
  const dropdownRef = useRef(null);
  function safeGetSavedRegion() {
    try {
      const saved = typeof window !== "undefined" ? window.localStorage.getItem(STORAGE_KEY) : null;
      const valid = new Set(REGIONS.map(r => r.code));
      return saved && valid.has(saved) ? saved : "eu";
    } catch {
      return "eu";
    }
  }
  function safeSetSavedRegion(code) {
    try {
      if (typeof window !== "undefined") {
        window.localStorage.setItem(STORAGE_KEY, code);
      }
    } catch {}
  }
  function dispatchRegionChanged(code) {
    try {
      if (typeof window !== "undefined") {
        window.dispatchEvent(new CustomEvent("abbyy:region-changed", {
          detail: {
            code
          }
        }));
      }
    } catch {}
  }
  function replaceRegionInString(text, currentRegion) {
    if (typeof text !== "string") return text;
    const hostRegex = /https:\/\/vantage-(eu|us|au)\.abbyy\.com/gi;
    const tokenRegex = /https:\/\/vantage-\[region\]\.abbyy\.com/gi;
    const bareHostRegex = /vantage-(eu|us|au)\.abbyy\.com/gi;
    const bareTokenRegex = /vantage-\[region\]\.abbyy\.com/gi;
    return text.replace(hostRegex, `https://vantage-${currentRegion}.abbyy.com`).replace(tokenRegex, `https://vantage-${currentRegion}.abbyy.com`).replace(bareHostRegex, `vantage-${currentRegion}.abbyy.com`).replace(bareTokenRegex, `vantage-${currentRegion}.abbyy.com`);
  }
  useEffect(() => {
    setRegion(safeGetSavedRegion());
  }, []);
  useEffect(() => {
    const root = containerRef.current;
    if (!root) return;
    const anchors = root.querySelectorAll("a[href]");
    anchors.forEach(a => {
      const href = a.getAttribute("href");
      if (href) {
        const next = replaceRegionInString(href, region);
        if (next !== href) {
          a.setAttribute("href", next);
        }
      }
    });
    const walker = typeof document !== "undefined" ? document.createTreeWalker(root, NodeFilter.SHOW_TEXT, null) : null;
    if (walker) {
      const toUpdate = [];
      let node = walker.nextNode();
      while (node) {
        const updated = replaceRegionInString(node.nodeValue, region);
        if (updated !== node.nodeValue) {
          toUpdate.push([node, updated]);
        }
        node = walker.nextNode();
      }
      toUpdate.forEach(([textNode, value]) => {
        textNode.nodeValue = value;
      });
    }
  }, [region, children]);
  useEffect(() => {
    const root = containerRef.current;
    if (!root) return;
    const anchors = root.querySelectorAll("a[href]");
    anchors.forEach(a => {
      a.style.fontWeight = "600";
      a.style.textDecoration = "underline";
      a.style.textUnderlineOffset = "2px";
    });
  }, [region, children]);
  useEffect(() => {
    const onRegionChanged = evt => {
      const code = evt && evt.detail && evt.detail.code;
      if (!code || code === region) return;
      setRegion(code);
    };
    if (typeof window !== "undefined") {
      window.addEventListener("abbyy:region-changed", onRegionChanged);
    }
    return () => {
      if (typeof window !== "undefined") {
        window.removeEventListener("abbyy:region-changed", onRegionChanged);
      }
    };
  }, [region]);
  useEffect(() => {
    const onClickAway = e => {
      if (!dropdownRef.current) return;
      if (!dropdownRef.current.contains(e.target)) {
        setOpen(false);
      }
    };
    document.addEventListener("click", onClickAway, true);
    return () => document.removeEventListener("click", onClickAway, true);
  }, []);
  const onSelect = code => {
    setRegion(code);
    safeSetSavedRegion(code);
    dispatchRegionChanged(code);
    setOpen(false);
  };
  const current = REGIONS.find(r => r.code === region) || REGIONS[0];
  return <div className="not-prose">
      <div className="mb-4 inline-flex items-center gap-2" ref={dropdownRef}>
        <span className="text-sm text-zinc-950/80 dark:text-white/80">Tenant Region:</span>
        <div className="relative">
          <button type="button" aria-haspopup="listbox" aria-expanded={open ? "true" : "false"} onClick={() => setOpen(v => !v)} className="h-8 px-3 rounded-md bg-zinc-900/5 dark:bg-white/5 border border-zinc-950/20 dark:border-white/20 text-sm inline-flex items-center gap-2">
            <span className="text-zinc-950 dark:text-white">{current.label}</span>
            <svg width="8" height="24" viewBox="0 -9 3 24" className="transition-transform text-gray-400 overflow-visible dark:text-gray-600 ml-auto" style={{
    transform: open ? "rotate(270deg)" : "rotate(90deg)"
  }}>
              <path d="M0 0L3 3L0 6" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round"></path>
            </svg>
          </button>
          {open ? <div role="listbox" className="absolute z-50 left-full top-0 ml-2 w-56 rounded-xl border border-zinc-950/20 dark:border-white/20 bg-white dark:bg-zinc-900 shadow-lg p-2">
              {REGIONS.map(r => {
    const selected = r.code === region;
    return <button key={r.code} type="button" role="option" aria-selected={selected ? "true" : "false"} onClick={() => onSelect(r.code)} className={"w-full flex items-center justify-between px-3 py-2 rounded-lg text-sm hover:bg-zinc-950/5 dark:hover:bg-white/10 text-zinc-950 dark:text-white" + (selected ? " font-medium" : "")}>
                    <span style={selected ? {
      color: "#ff2038"
    } : undefined}>{r.label}</span>
                    <span className={selected ? "ml-3" : "ml-3 invisible"} style={selected ? {
      color: "#ff2038"
    } : undefined}>✓</span>
                  </button>;
  })}
            </div> : null}
        </div>
      </div>
      <div ref={containerRef} className="prose dark:prose-invert max-w-none">{children}</div>
    </div>;
};

Ce mécanisme d’authentification est considéré comme le plus sûr, car au lieu d’adresser la requête d’authentification à l’utilisateur, l’application l’envoie au serveur d’autorisation Vantage. Le serveur d’autorisation authentifie ensuite l’utilisateur et renvoie le code d’autorisation au client.

Pour empêcher l’interception du code d’autorisation, ce scénario d’authentification utilise une extension de sécurité appelée PKCE (Proof Key for Code Exchange). Son fonctionnement est le suivant : chaque requête d’autorisation nécessite la génération d’un nombre aléatoire cryptographiquement sûr, stocké dans **code\_verifier**, lequel est ensuite utilisé pour obtenir une valeur signée de manière cryptographique, stockée dans **code\_challenge**. Cette valeur est ensuite envoyée au serveur d’autorisation afin d’obtenir un code d’autorisation.

Pour plus d’informations sur PKCE, consultez [cet article](https://datatracker.ietf.org/doc/html/rfc7636).

<div id="getting-the-authorization-code">
  #### Obtention du code d’autorisation
</div>

Pour lancer le processus d’authentification, redirigez l’utilisateur vers le point de terminaison authorize en transmettant les paramètres suivants :

| Parameter                                      | Description                                                                                                                                                                           |
| ---------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| client\_id                                     | L’identifiant de l’application. Pour savoir comment créer un client de l’API Vantage (**client\_id** et **client\_secret**), consultez l’article Managing Tenant Vantage API Clients. |
| redirect\_uri                                  | L’URL de votre application ou de votre site web utilisée pour rediriger le navigateur une fois les autorisations d’accès accordées.                                                   |
| response\_type=code                            | Indique que le type de réponse « authorization code » est utilisé.                                                                                                                    |
| scope=openid permissions global.wildcard       | Indique le périmètre d’autorisation.                                                                                                                                                  |
| state                                          | Une valeur `string` arbitraire qui contiendra le résultat de l’autorisation dans la réponse.                                                                                          |
| code\_challenge                                | Valeur signée numériquement du **code\_verifier** (en utilisant la méthode **code\_challenge\_method**).                                                                              |
| code\_challenge\_method                        | La méthode de signature numérique pour le **code\_verifier** (S256).                                                                                                                  |
| productId=a8548c9b-cb90-4c66-8567-d7372bb9b963 | L’identifiant Vantage.                                                                                                                                                                |

<Warning>
  Les valeurs pour response\_type, scope et productId doivent être exactement celles indiquées ci-dessus. Ces clés, à l’exception de response\_type, sont susceptibles de changer. Envisagez de les conserver dans une configuration.
</Warning>

Sample Request

<VantageRegion>
  ```shell wrap theme={null}
  https://vantage-us.abbyy.com/auth2/connect/authorize?client_id=client_id&redirect_uri=https%3A%2F%2Fvantage-us.abbyy.com%2Flogin-callback&response_type=code&scope=openid%20permissions%20global.wildcard&state=ef30939211cc4ecb9a7a349b855c6a10&code_challenge=tA6ayQ5VUjLX2tufAKaHh-9bTAQ4hQQY5VZAoB2kG9o&code_challenge_method=S256&productId=a8548c9b-cb90-4c66-8567-d7372bb9b963
  ```
</VantageRegion>

Un paramètre appelé redirect\_uri, qui contient l’identifiant de votre ressource, est utilisé dans OAuth 2.0 afin de permettre à Vantage d’envoyer le code d’autorisation à votre ressource, puis d’échanger ce code contre le jeton d’accès, requis pour l’authentification lors de tous les appels API ultérieurs. L’utilisation de cette méthode d’authentification nécessite de fournir la valeur du paramètre redirect\_uri à l’assistance technique d’ABBYY afin qu’elle soit ajoutée à la liste d’autorisation par les administrateurs.

Une fois que les autorisations d’accès demandées à l’aide du paramètre scope ont été confirmées comme accordées, le navigateur est redirigé vers une page Web spéciale configurée par le serveur Vantage. Cette page comporte une fenêtre de dialogue permettant de procéder à l’autorisation avec votre compte. Cette page doit être ouverte dans un navigateur doté d’une barre d’adresse visible, ce qui vous permettra de vérifier l’URL de la page et l’état du certificat SSL de la connexion.

Si votre adresse e-mail est associée à plusieurs comptes dans différents locataires, il vous sera demandé de sélectionner un locataire et de saisir votre mot de passe après avoir indiqué votre adresse e-mail. Vous pouvez également transmettre l’identifiant de votre locataire (le paramètre tokenId) directement en utilisant l’une des ressources suivantes :

<VantageRegion>
  ```shell wrap theme={null}
  https://vantage-us.abbyy.com/auth2/{tenantId}/connect/authorize?client_id=client_id&redirect_uri=external_app_redirect_uri&response_type=code
  &scope=openid%20permissions%20global.wildcard&state=state&code_challenge=code_challenge
  &code_challenge_method=S256&productId=a8548c9b-cb90-4c66-8567-d7372bb9b963
  ```
</VantageRegion>

ou

<VantageRegion>
  ```shell wrap theme={null}
  https://vantage-us.abbyy.com/auth2/connect/authorize?client_id=client_id&redirect_uri=external_app_redirect_uri&response_type=code
  &scope=openid%20permissions%20global.wildcard&state=state&code_challenge=code_challenge
  &code_challenge_method=S256&productId=a8548c9b-cb90-4c66-8567-d7372bb9b963&tenantId=tenantId
  ```
</VantageRegion>

Vous devrez saisir le mot de passe de votre compte client. Une fois vos identifiants saisis, l’autorisation est effectuée côté serveur, l’application se voit accorder l’accès à l’API Vantage et vous recevez le code d’autorisation dans la réponse à votre requête.

Veuillez noter que si un site ou une application utilise ce type d’authentification, les utilisateurs de Vantage accorderont, en leur nom, l’accès à l’API Vantage au site ou à l’application que vous ajoutez à la liste des URL de redirection autorisées. Pour accorder l’accès au site ou à l’application, il sera demandé aux utilisateurs de s’authentifier dans Vantage à l’aide de leur identifiant et de leur mot de passe. Une fois l’utilisateur authentifié, le site ou l’application se verra accorder les autorisations suivantes :

* Gérer les catalogues de données dans le locataire Vantage au nom de l’utilisateur,
* Accéder aux compétences dans le locataire Vantage au nom de l’utilisateur,
* Créer et accéder aux transactions Vantage au nom de l’utilisateur.

Le site ou l’application ne pourra pas modifier le mot de passe de l’utilisateur, modifier la liste des utilisateurs d’un locataire Vantage ni modifier les compétences. Seul l’accès à l’API Vantage sera accordé. L’utilisateur ne pourra pas révoquer l’accès une fois qu’il aura été accordé.

<div id="getting-the-authorization-token">
  #### Obtention du jeton d’autorisation
</div>

Une fois que vous avez obtenu le code d’autorisation, vous disposez d’une minute pour l’échanger contre le jeton d’accès. Utilisez une requête POST vers le point de terminaison du jeton avec des données `application/x-www-form-urlencoded`.

Paramètres du corps de la requête :

| Parameter                                                | Description                                                                                                            |
| -------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- |
| code\_verifier                                           | Le code que vous avez généré. Nécessaire pour confirmer l’initialisation de la demande d’autorisation.                 |
| client\_id                                               | L’identifiant de l’application.                                                                                        |
| client\_secret                                           | La clé sécurisée de l’application.                                                                                     |
| code                                                     | Votre code d’autorisation obtenu auprès du serveur.                                                                    |
| redirect\_uri                                            | L’URL de redirection utilisée lors de l’étape d’autorisation.                                                          |
| grant\_type=authorization\_code                          | Indique que le type d’octroi « authorization code » est utilisé.                                                       |
| scope=openid permissions global.wildcard offline\_access | Spécifie le périmètre d’autorisation. Pour obtenir un jeton d’actualisation, ajoutez **offline\_access** au périmètre. |

Exemple de requête :

Pour Windows :

<VantageRegion>
  ```shell theme={null}
  curl --location --request POST "https://vantage-eu.abbyy.com/auth2/connect/token" \
    --data-urlencode "code_verifier=code_verifier" \
    --data-urlencode "client_id=client_id" \
    --data-urlencode "client_secret=client_secret" \
    --data-urlencode "code=authorization code" \
    --data-urlencode "redirect_uri=external app redirect uri" \
    --data-urlencode "grant_type=authorization_code"
  ```
</VantageRegion>

Pour Linux :

<VantageRegion>
  ```shell theme={null}
  curl --location --request POST 'https://vantage-eu.abbyy.com/auth2/connect/token' \
    --data-urlencode 'code_verifier=code_verifier' \
    --data-urlencode 'client_id=client_id' \
    --data-urlencode 'client_secret=client_secret' \
    --data-urlencode 'code=authorization code' \
    --data-urlencode 'redirect_uri=external app redirect uri' \
    --data-urlencode 'grant_type=authorization_code'
  ```
</VantageRegion>

La réponse du serveur à votre demande contiendra le jeton d’accès :

```json theme={null}
{
  "id_token": "<redacted>",
  "access_token": "<redacted>",
  "expires_in": 86400,
  "token_type": "Bearer",
  "refresh_token": "<redacted>",
  "scope": "openid permissions global.wildcard offline_access legacy.client"
}
```

Pour plus d’informations sur le flux d’autorisation par code (Authorization Code Flow), consultez [ce lien](https://datatracker.ietf.org/doc/html/rfc6749#section-4.1).

Pour chaque flux, la clé **access\_token** contient le jeton, tandis que la clé **expires\_in** indique le délai avant son expiration (en secondes). Par défaut, la durée de vie d’un jeton d’accès est de 24 heures (pour plus d’informations, voir [Durée de vie des jetons](#token-lifetimes)). Ajoutez l’en-tête d’autorisation suivant à toutes vos requêtes et remplacez `token` par la valeur que vous avez reçue :

```shell theme={null}
-H "Authorization: Bearer token"
```

Notez que vous pouvez obtenir plusieurs jetons avec le même compte. Pour plus d’informations sur le jeton d’autorisation, consultez [ce lien](https://datatracker.ietf.org/doc/html/rfc6749#section-7.1).

<div id="getting-the-refresh-token">
  #### Obtention du jeton d’actualisation
</div>

Si l’option `Allow issuing refresh tokens to refresh access tokens` a été activée lors de la configuration du client de l’API Vantage et que la requête pour obtenir le jeton d’accès contenait le paramètre `scope=openid permissions global.wildcard offline_access`, vous recevrez également un jeton d’actualisation supplémentaire dans la réponse. Une fois que vous disposez d’un jeton d’actualisation, vous pouvez actualiser le jeton d’accès à l’aide d’une requête POST vers le point de terminaison du jeton avec les paramètres suivants :

| Paramètre                  | Description                                                                 |
| -------------------------- | --------------------------------------------------------------------------- |
| client\_id                 | L’identifiant de l’application.                                             |
| client\_secret             | Une clé d’application sécurisée.                                            |
| refresh\_token             | Votre jeton d’actualisation obtenu auprès du serveur.                       |
| grant\_type=refresh\_token | Indique que le type d’octroi basé sur le jeton d’actualisation est utilisé. |

Exemple de requête :

Pour Windows :

<VantageRegion>
  ```shell theme={null}
  curl --location --request POST "https://vantage-eu.abbyy.com/auth2/connect/token" \
    --data-urlencode "client_id=client_id" \
    --data-urlencode "client_secret=client_secret" \
    --data-urlencode "refresh_token=refresh_token" \
    --data-urlencode "grant_type=refresh_token"
  ```
</VantageRegion>

Pour Linux :

<VantageRegion>
  ```shell theme={null}
  curl --location --request POST 'https://vantage-eu.abbyy.com/auth2/connect/token' \
    --data-urlencode 'client_id=client_id' \
    --data-urlencode 'client_secret=client_secret' \
    --data-urlencode 'refresh_token=refresh_token' \
    --data-urlencode 'grant_type=refresh_token'
  ```
</VantageRegion>

<div id="token-lifetimes">
  #### Durée de vie des jetons
</div>

Les jetons d’accès et d’actualisation sont configurés pour avoir les durées de vie suivantes :

* **Durée de vie du jeton d’accès :** Définit la période pendant laquelle le jeton d’accès émis permet à l’utilisateur d’accéder à Vantage. La durée de vie par défaut d’un jeton d’accès est de 24 heures.
* **Durée de vie du jeton d’actualisation :** Définit la période maximale, à partir de l’émission du premier jeton d’accès, pendant laquelle le jeton d’actualisation émis peut être utilisé pour renouveler le jeton d’accès. La durée de vie par défaut d’un jeton d’actualisation est de 30 jours.
