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

# JSON Web Tokenを使用した認証

> JSON Web Tokenを使用してABBYY FlexiCapture 12ユーザーを認証します。署名付きJWTを作成してApplication ServerにPOSTし、返されたチケットを呼び出しで使用します。

<div id="overview-of-the-authentication-process">
  ## 認証プロセスの概要
</div>

JSON Web Token (JWT) は、ABBYY FlexiCapture 12 Application Server とサードパーティ サービスの間でデータを安全にやり取りするために使用されるデータ形式です。JWT を使用して認証を行う場合、識別情報は Application Server に送信されません。認証はサードパーティ サービス側で行われ、その後、ユーザーが信頼できるサービスによって認証済みであることが Application Server に通知されます。

<div id="implementation">
  ## 実装
</div>

<div id="get-json-data">
  ### JSONデータを取得する
</div>

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

JSON Web Token (JWT) を作成するため、ユーザー証明書を含むJSONデータはBase64でエンコードされます。

次のサンプルは、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">
  ### JWT を Application Server に送信する
</div>

JWT は、次の URL を使用して Application Server に送信する必要があります: `https://<ApplicationServer>/Flexicapture12/Server/jwt`。これは POST リクエストで行います。

<Note>
  テナントを使用している場合は、テナントの識別子を Application Server URL に追加します: `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() );
        }
    }
}
```

認証を機能させるには、JWT の識別子 (`nameid` ノードの値に含まれる) と一致するログインを持つユーザーが Application Server に登録されている必要があります。

Application Server は次のようなレスポンスを返します。

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

`ticket` field の値は、認証済みの ABBYY FlexiCapture 12 チケットです。このチケットを使用すると、認証が必要なすべての Application Server インターフェイスを呼び出すことができます。サービスへのアクセスには ABBYY FlexiCapture 認証を使用する必要があります。つまり、`https://<ApplicationServer>/flexicapture12/Server/FCAuth/` または `https://<ApplicationServer>/flexicapture12/Server/MobileApp/` で始まるアドレスを使用します。

<div id="use-an-authenticated-abbyy-flexicapture-12-ticket">
  ### 認証済みの ABBYY FlexiCapture 12 チケットを使用する
</div>

認証済みの ABBYY FlexiCapture 12 チケットは、cookie ファイル (ファイル名は `FlexiCaptureTmpPrn` である必要があります) または `Authorization: Bearer` ヘッダーを使用してサーバーに渡すことができます。

たとえば:

```
Authorization: Bearer 82BD00C6601EB7F8EF4265450F934D4103C5CA2F010DE1C5FAB4CC830A82300C743D09E5477279733F283D0B6E1C93ACC30FE353D4D9396649965432AAA7994078C3CC63567A95A35E03DA6FDE020F57
```

`Authorization: Bearer` ヘッダーの使用を推奨します (cookie がサポートされるのは下位互換性のためだけです) 。

<div id="set-up-a-trusted-certificate-on-the-application-server">
  ### Application Server で信頼済み証明書を設定する
</div>

Application Server は、ID プロバイダーから受信したデータを検証します。Application Server がこのデータを信頼するには、そのデータが、Application Server の信頼済み認証局データベースに登録されている認証局によって発行されたカスタム証明書で署名されている必要があります。

証明書を ABBYY FlexiCapture データベースにインポートします。これで、この証明書を使用してデータが検証されます。詳しくは、[Single Sign-On の設定](/ja/flexi-capture/sso-settings)を参照してください。

検証に失敗した場合、Application Server は `Web.config` ファイルの `<appSettings>` 設定内にある `AllowMixedModeCertificateValidation` パラメーターを参照します。このパラメーターが `true` に設定されている場合、Application Server を実行しているコンピューター上のローカル コンピューター証明書ストアの **Trusted Root Certification Authorities** フォルダーに追加された証明書を使用して検証が行われます。

データベースに証明書が追加されていない場合は、**Trusted Root Certification Authorities** フォルダーにある証明書を使用して検証が行われ、`AllowMixedModeCertificateValidation` パラメーターは無視されます。

**プロジェクトと関連資料をダウンロードするには、次のリンクを使用してください:** [JWT\_Example.zip](JWT_Example.zip)
