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

# Autenticación con JSON Web Tokens

> Autentique a los usuarios de ABBYY FlexiCapture 12 con JSON Web Tokens: cree un JWT firmado, envíelo en una solicitud POST al Servidor de aplicaciones y use el ticket devuelto en las llamadas.

<div id="overview-of-the-authentication-process">
  ## Descripción general del proceso de autenticación
</div>

JSON Web Token (JWT) es un formato de transferencia de datos que se utiliza para transferir datos de forma segura entre el Servidor de aplicaciones de ABBYY FlexiCapture 12 y servicios de terceros. Al autenticarse mediante JWT, no se envían datos de identificación al Servidor de aplicaciones. La autenticación se realiza en un servicio de terceros, tras lo cual se informa al Servidor de aplicaciones de que el usuario ha sido autenticado por un servicio de confianza.

<div id="implementation">
  ## Implementación
</div>

<div id="get-json-data">
  ### Obtener datos JSON
</div>

Ejemplo de datos 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"}
```

Los datos JSON que contienen certificados de usuario se codifican en Base64 para crear un JSON Web Token (JWT).

El siguiente ejemplo crea un token 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">
  ### Envíe un JWT al Servidor de aplicaciones
</div>

Debe enviar un JWT al Servidor de aplicaciones mediante la siguiente URL: `https://<ApplicationServer>/Flexicapture12/Server/jwt`. Para ello, use una solicitud POST.

<Note>
  Si utiliza un tenant, agregue el identificador del tenant a la URL del Servidor de aplicaciones: `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() );
        }
    }
}
```

Para que la autenticación funcione, debe haber un usuario registrado en el Servidor de aplicaciones cuyo login coincida con el identificador del JWT (incluido en el valor del nodo `nameid`).

El Servidor de aplicaciones devuelve una respuesta como esta:

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

El valor del campo `ticket` es el ticket autenticado de ABBYY FlexiCapture 12. Puede usar este ticket para realizar llamadas a todas las interfaces del Servidor de aplicaciones que requieran autenticación. Se debe acceder a los servicios mediante la autenticación de ABBYY FlexiCapture, es decir, usando direcciones que comiencen con `https://<ApplicationServer>/flexicapture12/Server/FCAuth/` o `https://<ApplicationServer>/flexicapture12/Server/MobileApp/`.

<div id="use-an-authenticated-abbyy-flexicapture-12-ticket">
  ### Uso de un ticket autenticado de ABBYY FlexiCapture 12
</div>

Puede enviar al servidor un ticket autenticado de ABBYY FlexiCapture 12 mediante un archivo de cookies (el archivo debe llamarse `FlexiCaptureTmpPrn`) o con el encabezado `Authorization: Bearer`.

Por ejemplo:

```
Authorization: Bearer 82BD00C6601EB7F8EF4265450F934D4103C5CA2F010DE1C5FAB4CC830A82300C743D09E5477279733F283D0B6E1C93ACC30FE353D4D9396649965432AAA7994078C3CC63567A95A35E03DA6FDE020F57
```

Recomendamos usar un encabezado `Authorization: Bearer` (las cookies solo se admiten por compatibilidad con versiones anteriores).

<div id="set-up-a-trusted-certificate-on-the-application-server">
  ### Configurar un certificado de confianza en el Servidor de aplicaciones
</div>

El Servidor de aplicaciones comprobará los datos recibidos del proveedor de identidad. Para que el Servidor de aplicaciones confíe en estos datos, deben estar firmados con un certificado personalizado emitido por una autoridad incluida en la base de datos de autoridades de confianza del Servidor de aplicaciones.

Importe el certificado en la base de datos de ABBYY FlexiCapture. A partir de ese momento, los datos se comprobarán con este certificado. Para obtener más información, consulte [Configurar el inicio de sesión único](/es/flexi-capture/sso-settings).

Si la comprobación falla, el Servidor de aplicaciones se basará en el parámetro `AllowMixedModeCertificateValidation` de la configuración de `<appSettings>` del archivo `Web.config`. Si este parámetro está establecido en `true`, la comprobación se realizará con el certificado agregado a la carpeta **Trusted Root Certification Authorities** del almacén de certificados del equipo local en el servidor donde se ejecuta el Servidor de aplicaciones.

Si no se agrega ningún certificado a la base de datos, la comprobación se realizará con el certificado ubicado en la carpeta **Trusted Root Certification Authorities**, y el parámetro `AllowMixedModeCertificateValidation` se ignorará.

**Para descargar el proyecto y los materiales complementarios, use este enlace:** [JWT\_Example.zip](JWT_Example.zip)
