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

Los datos JSON tienen este aspecto.

```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>

Envíe el JWT al Servidor de aplicaciones mediante una solicitud POST a `https://<ApplicationServer>/Flexicapture12/Server/jwt`.

Para un tenant, agregue el identificador del tenant a la URL, por ejemplo, `https://<ApplicationServer>/Flexicapture12/Server/jwt?Tenant=MyTenantName`.

```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() );
        }
    }
}
```

La autenticación requiere que haya un usuario registrado en el Servidor de aplicaciones. Su login debe coincidir 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>

Envíe un ticket autenticado de ABBYY FlexiCapture 12 al servidor con un encabezado `Authorization: Bearer`. También funciona un archivo de cookies llamado `FlexiCaptureTmpPrn`, pero solo se admite por compatibilidad con versiones anteriores.

Por ejemplo:

```http theme={null}
Authorization: Bearer 82BD00C6601EB7F8EF4265450F934D4103C5CA2F010DE1C5FAB4CC830A82300C743D09E5477279733F283D0B6E1C93ACC30FE353D4D9396649965432AAA7994078C3CC63567A95A35E03DA6FDE020F57
```

<div id="set-up-a-trusted-certificate-on-the-application-server">
  ### Configure 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, fírmelos con un certificado personalizado. La entidad emisora debe figurar en la base de datos de autoridades de confianza del Servidor de aplicaciones.

Importe el certificado en la base de datos de ABBYY FlexiCapture. El Servidor de aplicaciones comprobará entonces los datos con ese certificado. Para obtener más información, consulte [Configure Single Sign-On](/es/flexi-capture/sso-settings).

Si la comprobación falla, el Servidor de aplicaciones consulta el parámetro `AllowMixedModeCertificateValidation` de `<appSettings>` en el archivo `Web.config`. Cuando ese parámetro es `true`, la comprobación utiliza el certificado de la carpeta **Trusted Root Certification Authorities**. Esta carpeta se encuentra en el almacén de certificados Equipo local del equipo que ejecuta el Servidor de aplicaciones.

Si la base de datos no contiene certificados, la comprobación recurre al certificado de la carpeta **Trusted Root Certification Authorities**. En ese caso, se ignora el parámetro `AllowMixedModeCertificateValidation`.

Hay disponible un proyecto de ejemplo y los materiales que lo acompañan como `JWT_Example.zip`.
