> ## 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.

# Authentification avec des JSON Web Tokens

> Authentifiez les utilisateurs d’ABBYY FlexiCapture 12 avec des JSON Web Tokens : créez un JWT signé, envoyez-le en POST au serveur d’applications, puis utilisez le ticket renvoyé dans vos appels.

<div id="overview-of-the-authentication-process">
  ## Vue d’ensemble du processus d’authentification
</div>

Le JSON Web Token (JWT) est un format d’échange de données utilisé pour transférer des données de manière sécurisée entre le serveur d’applications d’ABBYY FlexiCapture 12 et des services tiers. Lors d’une authentification via JWT, aucune donnée d’identification n’est envoyée au serveur d’applications. L’authentification s’effectue sur un service tiers, après quoi le serveur d’applications est informé que l’utilisateur a été authentifié par un service de confiance.

<div id="implementation">
  ## Implémentation
</div>

<div id="get-json-data">
  ### Récupérer les données JSON
</div>

Exemple de données JSON :

```json theme={null}
{"alg":"RS256","kid":"-JLCtyyTyF69AZrtjpk-xGs-nUE","x5t":"-JLCtyyTyF69AZrtjpk-xGs-nUE","typ":"JWT"}
{"nameid":"user","nbf":1572267172,"exp":1572267772,"iss":"ABBYY","aud":"test JWT app"}
```

Les données JSON contenant les certificats d’utilisateur sont encodées en Base64 pour créer un JSON Web Token (JWT).

L’exemple suivant crée un jeton JWT :

```csharp theme={null}
using System.IdentityModel.Tokens.Jwt;
using System.Security.Cryptography.X509Certificates;
…

static string createEncryptedJwtToken(
    X509Certificate2 encryptCert,
    string issuer,
    string audience,
    string nameid,
    TimeSpan expirationTimespan )
{
    X509SigningCredentials signingCredentials = new X509SigningCredentials( encryptCert );
    JwtHeader jwtHeader = new JwtHeader( signingCredentials );
    var claims = new Claim[]
    {
        new Claim( "nameid", nameid )
    };
    var now = DateTime.UtcNow;
    JwtSecurityToken newToken = new JwtSecurityToken(
        issuer,
        audience,
        claims,
        now,
        now.Add( expirationTimespan ),
        signingCredentials
    );
    var token = new JwtSecurityTokenHandler().WriteToken(newToken);
    return token;
}
```

<div id="send-a-jwt-to-the-application-server">
  ### Envoyer un JWT au serveur d’applications
</div>

Un JWT doit être envoyé au serveur d’applications via l’URL suivante : `https://<ApplicationServer>/Flexicapture12/Server/jwt`. Cette opération s’effectue au moyen d’une requête POST.

<Note>
  Si vous utilisez un tenant, ajoutez l’identifiant du tenant à l’URL du serveur d’applications : `https://<ApplicationServer>/Flexicapture12/Server/jwt?Tenant=MyTenantName`
</Note>

```csharp theme={null}
static async Task<string> AuthenticateByJwtAsync( string jwtToken )
{
    var fields = new Dictionary<string, string>
    {
        { "JwtToken", jwtToken }
    };
    FormUrlEncodedContent content = new FormUrlEncodedContent( fields );
    using ( var client = new HttpClient() )
    {
        HttpResponseMessage response = await client.PostAsync( jwtServiceUrl, content );
        if ( response.StatusCode == HttpStatusCode.OK )
        {
            return response.Headers.GetValues( "AuthTicket" )?.First() ?? throw new Exception( "AuthTicket header not found" );
        }
        else
        {
            throw new Exception( await response.Content.ReadAsStringAsync() );
        }
    }
}
```

Pour que l’authentification fonctionne, un utilisateur dont le login correspond à l’identifiant figurant dans le JWT (contenu dans la valeur du nœud `nameid`) doit être enregistré sur le serveur d’applications.

Le serveur d’applications renvoie une réponse de ce type :

```xml theme={null}
<?xml version="1.0" encoding="utf-8" ?>
<authTicket>
    <userName>user</userName>
    <ticket>79BB391216E9BBA3DA13E5F29669FF1EB48C387C8FDE41D473AA5698A2E16A8B6E91470F05F3C2FBF685630FD7683DC2FA42A900A007CFAD1AD310FEE1ADADFC</ticket>
</authTicket>
```

La valeur du champ `ticket` est le ticket ABBYY FlexiCapture 12 authentifié. Vous pouvez utiliser ce ticket pour appeler toutes les interfaces du serveur d’applications qui nécessitent une authentification. Les services doivent être accessibles à l’aide de l’authentification ABBYY FlexiCapture, c’est-à-dire via des adresses commençant par `https://<ApplicationServer>/flexicapture12/Server/FCAuth/` ou `https://<ApplicationServer>/flexicapture12/Server/MobileApp/`.

<div id="use-an-authenticated-abbyy-flexicapture-12-ticket">
  ### Utilisation d’un ticket ABBYY FlexiCapture 12 authentifié
</div>

Vous pouvez transmettre au serveur un ticket ABBYY FlexiCapture 12 authentifié à l’aide d’un fichier de cookie (le fichier doit être nommé `FlexiCaptureTmpPrn`) ou de l’en-tête `Authorization: Bearer`.

Par exemple :

```
Authorization: Bearer 82BD00C6601EB7F8EF4265450F934D4103C5CA2F010DE1C5FAB4CC830A82300C743D09E5477279733F283D0B6E1C93ACC30FE353D4D9396649965432AAA7994078C3CC63567A95A35E03DA6FDE020F57
```

Nous vous recommandons d’utiliser l’en-tête `Authorization: Bearer` (les cookies sont pris en charge uniquement pour des raisons de compatibilité descendante).

<div id="set-up-a-trusted-certificate-on-the-application-server">
  ### Configuration d’un certificat de confiance sur le serveur d’applications
</div>

Le serveur d’applications vérifie les données reçues du fournisseur d’identité. Pour que le serveur d’applications puisse leur faire confiance, elles doivent être signées à l’aide d’un certificat personnalisé émis par une autorité de confiance répertoriée dans la base de données du serveur d’applications.

Importez le certificat dans la base de données ABBYY FlexiCapture. Les données seront alors vérifiées à l’aide de ce certificat. Pour plus d’informations, voir [Configuration de l’authentification unique](/fr/flexi-capture/sso-settings).

Si la vérification échoue, le serveur d’applications s’appuiera sur le paramètre `AllowMixedModeCertificateValidation` des paramètres `<appSettings>` du fichier `Web.config`. Si ce paramètre est défini sur `true`, la vérification sera effectuée à l’aide du certificat ajouté au dossier **Trusted Root Certification Authorities** dans le magasin de certificats de l’ordinateur local, sur l’ordinateur qui exécute le serveur d’applications.

Si aucun certificat n’est ajouté à la base de données, la vérification sera effectuée à l’aide du certificat situé dans le dossier **Trusted Root Certification Authorities**, et le paramètre `AllowMixedModeCertificateValidation` sera ignoré.

**Pour télécharger le projet et les éléments associés, utilisez ce lien :** [JWT\_Example.zip](JWT_Example.zip)
