# カスタムバックエンドの設定

{% hint style="warning" %}
このガイドでは、ドキュメント用の保護されたサインイン画面の設定方法を説明します。このガイドを進める前に、まず最初に次のプロセスを実施していることを確認してください： [認証されたアクセスを有効化する](https://gitbook-open-v2-preview.gitbook.workers.dev/url/gitbook.com/docs/documentation/ja-gitbook-documentation/publishing-documentation/authenticated-access/enabling-authenticated-access).
{% endhint %}

このガイドは、独自の認証バックエンドを使用して GitBook ドキュメンテーションサイトの保護されたサインイン画面を設定する手順を案内します。 **カスタム** 認証バックエンド。

{% hint style="info" %}
サポートされている認証プロバイダーのいずれかを使用している、または [OpenID Connect](https://auth0.com/docs/authenticate/protocols/openid-connect-protocol) （OIDC）準拠のバックエンドをお持ちの場合は、より簡潔なセットアップのために統合ガイドを参照してください：\
\
[Auth0](https://gitbook-open-v2-preview.gitbook.workers.dev/url/gitbook.com/docs/documentation/ja-gitbook-documentation/publishing-documentation/authenticated-access/setting-up-auth0) | [Azure AD](https://gitbook-open-v2-preview.gitbook.workers.dev/url/gitbook.com/docs/documentation/ja-gitbook-documentation/publishing-documentation/authenticated-access/setting-up-azure-ad) | [Okta](https://gitbook-open-v2-preview.gitbook.workers.dev/url/gitbook.com/docs/documentation/ja-gitbook-documentation/publishing-documentation/authenticated-access/setting-up-okta) | [AWS Cognito](https://gitbook-open-v2-preview.gitbook.workers.dev/url/gitbook.com/docs/documentation/ja-gitbook-documentation/publishing-documentation/authenticated-access/setting-up-aws-cognito) | [OIDC](https://gitbook-open-v2-preview.gitbook.workers.dev/url/gitbook.com/docs/documentation/ja-gitbook-documentation/publishing-documentation/authenticated-access/setting-up-oidc)
{% endhint %}

### 概要

GitBook サイトのカスタム認証システムを設定するには、次の主要な手順に従ってください：

{% stepper %}
{% step %}
[**ユーザーを認証するカスタムバックエンドを作成する**](#id-1.-create-a-custom-backend-to-authenticate-your-users)

ユーザーにログインを促し、認証を行うバックエンドを実装します。
{% endstep %}

{% step %}
[**JWT トークンに署名して GitBook に渡す**](#id-2.-sign-and-pass-a-jwt-token-to-gitbook)

JWT トークンを作成し、サイトの秘密鍵で署名します。
{% endstep %}

{% step %}
[**フォールバック URL を設定する**](#id-3.-configure-a-fallback-url)

認証されていない訪問者がサイトにアクセスしたときに使用される URL を設定します。
{% endstep %}

{% step %}
[**マルチテナント認証アクセスを設定する（オプション）**](#id-4.-set-up-multi-tenant-authenticated-access)

複数の GitBook サイトにまたがる認証を処理するようにバックエンドを設定します。
{% endstep %}

{% step %}
[**適応型コンテンツ用にバックエンドを設定する（オプション）**](#id-5.-configure-your-backend-for-adaptive-content)

GitBook の適応型コンテンツと連携するようバックエンドを設定します。
{% endstep %}
{% endstepper %}

### 1. ユーザーを認証するカスタムバックエンドを作成する

ドキュメントにアクセスする前にユーザーを認証するには、ログインとユーザー認証を処理できるサーバーを設定する必要があります。

バックエンドは次のことを行うべきです：

* 選択した認証方法を使ってユーザーにログインを促す。
* ユーザーの資格情報を検証し、認証する。
* 生成して署名する **JSON Web Token（JWT）** 認証が成功した際に。
* JWT を含めてユーザーを GitBook にリダイレクトする。

### 2. JWT トークンに署名して GitBook に渡す

バックエンドがユーザーを認証したら、 **JWT を生成し** および **それを GitBook に渡す** 際に **リダイレクトして** ください。トークンはサイトのオーディエンス設定に表示される **秘密鍵** を使用して署名する必要があります。 [認証されたアクセスを有効化する](https://gitbook-open-v2-preview.gitbook.workers.dev/url/gitbook.com/docs/documentation/ja-gitbook-documentation/publishing-documentation/enabling-authenticated-access#enable-authenticated-access).

次の例は、カスタムバックエンドのログインリクエストハンドラがどのように見えるかを示すはずです：

{% code title="index.ts" %}

```typescript
import { Request, Response } from 'express';
import * as jose from 'jose';

import { getUserInfo } from '../services/user-info-service';
import { getFeatureFlags } from '../services/feature-flags-service';

const GITBOOK_VISITOR_SIGNING_KEY = process.env.GITBOOK_VISITOR_SIGNING_KEY!;
const GITBOOK_DOCS_URL = 'https://mycompany.gitbook.io/myspace';

export async function handleAppLoginRequest(req: Request, res: Response) {
    // ログインリクエストを処理するビジネスロジック
    // 例えば、資格情報の確認とユーザーの認証など
    //
    // 例：
    // const loggedInUser = await authenticateUser(req.body.username, req.body.password);
    
    // 署名済み JWT を生成する
    const gitbookVisitorJWT = await new jose.SignJWT({})
        .setProtectedHeader({ alg: 'HS256' })
        .setIssuedAt()
        .setExpirationTime('2h') // 任意の 2 時間の有効期限
        .sign(new TextEncoder().encode(GITBOOK_VISITOR_SIGNING_KEY));
    
    // JWT トークンを URL に含めてユーザーを GitBook にリダイレクトする
    const redirectURL = `${GITBOOK_DOCS_URL}/?jwt_token=${gitbookVisitorJWT}`;
    res.redirect(redirectURL);
}
```

{% endcode %}

### 3. フォールバック URL を設定する

フォールバック URL は、認証されていない訪問者が保護されたサイトにアクセスしようとしたときに使用されます。GitBook はその訪問者をこの URL にリダイレクトします。

この URL はカスタムバックエンド内のハンドラを指すべきで、そこでログインを促し、認証を行い、JWT を URL に含めて再びサイトにリダイレクトできます。

たとえば、ログイン画面が次の場所にある場合： `https://example.com/login`、この値をフォールバック URL として含めるべきです。

このフォールバック URL は、サイトのオーディエンス設定の「Authenticated access」タブ内で設定できます。

<figure><img src="https://4217681718-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FNkEGS7hzeqa35sMXQZ4X%2Fuploads%2FB48PEdMz1tCDf0Q0lo4d%2FScreenshot%202025-03-25%20at%2015.00.08.png?alt=media&#x26;token=e22fe867-e1f6-44f7-8b4f-a868ac620464" alt="A GitBook screenshot showing where to configure a fallback URL"><figcaption><p>フォールバック URL を設定する</p></figcaption></figure>

フォールバック URL にリダイレクトする際、GitBook は `location` というクエリパラメータをフォールバック URL に含めます。これをハンドラで利用してユーザーを元の場所にリダイレクトできます：

```javascript
const gitbookVisitorJWT = await new jose.SignJWT({})
    .setProtectedHeader({ alg: 'HS256' })
    .setIssuedAt()
    .setExpirationTime('2h') // 任意の 2 時間の有効期限
    .sign(new TextEncoder().encode(GITBOOK_VISITOR_SIGNING_KEY));
    
// JWT を jwt_token クエリパラメータとして含めて元の GitBook ドキュメント URL にリダイレクトする
// location が提供されている場合、ユーザーは元の目的地にリダイレクトされます
const redirectURL = `${GITBOOK_DOCS_URL}/${req.query.location || ''}?jwt_token=${gitbookVisitorJWT}`;
res.redirect(redirectURL);
```

{% hint style="warning" %}
GitBook は `location` search パラメータに依存しているため、フォールバック URL でそれを使用することはできません。たとえば、 `https://auth.gitbook.com/?location=something` は有効なフォールバック URL ではありません。
{% endhint %}

### 4. マルチテナント認証アクセスを設定する（オプション）

GitBook をプラットフォームとして使用し、異なる顧客にコンテンツを提供している場合、マルチテナント認証アクセスを設定する必要があるでしょう。認証バックエンドは複数の異なるサイトにまたがる認証を処理する責任を負う必要があります。これはカスタム認証バックエンドのコードにいくつかの小さな変更を加えることで GitBook で可能です。

#### 認証サーバーにすべてのテナントを追加すること

認証バックエンドは、処理する予定のすべての GitBook サイトの JWT 署名鍵と URL を知っている必要があります。組織に Customer A と Customer B の 2 つのサイトがある場合、認証コードはそのようなマッピングを保存することが考えられます：

```typescript
const CUSTOMER_A = {
  jwtSigningKey: 'aaa-aaa-aaa-aaa',
  url: 'https://mycompany.gitbook.io/customer-a'
};

const CUSTOMER_B = {
  jwtSigningKey: 'bbb-bbb-bbb-bbb',
  url: 'https://mycompany.gitbook.io/customer-b'
};
```

#### 認証サーバーに追加のコンテキストを提供すること

GitBook がユーザーのリクエストを認証できない場合、ユーザーをフォールバック URL にリダイレクトします。この URL は認証バックエンドを指し、そこでユーザーを認証して要求されたコンテンツに戻すリダイレクトを行う責任があります。

複数のテナントをサポートするには、認証バックエンドがユーザーがアクセスすべき GitBook サイトを知る必要があります。この情報はフォールバック URL に含めて渡すことができます。

例えば、各サイトのフォールバック URL を次のように設定できます：

<table><thead><tr><th width="150.75390625">GitBook サイト</th><th>フォールバック URL</th></tr></thead><tbody><tr><td>Customer A サイト</td><td><code>https://auth-backend.acme.org/login?site=customer-a</code></td></tr><tr><td>Customer B サイト</td><td><code>https://auth-backend.acme.org/login?site=customer-b</code></td></tr></tbody></table>

認証バックエンドはこの情報をチェックし、それに応じて適切なサイトへのリダイレクトを処理できます：

```javascript
const customerInfo = req.query.site === 'customer-a' ? CUSTOMER_A : CUSTOMER_B;
  
const gitbookVisitorJWT = await new jose.SignJWT({})
    .setProtectedHeader({ alg: 'HS256' })
    .setIssuedAt()
    .setExpirationTime('2h') // 任意の 2 時間の有効期限
    .sign(new TextEncoder().encode(customerInfo.jwtSigningKey));
    
// JWT を jwt_token クエリパラメータとして含めて元の GitBook ドキュメント URL にリダイレクトする
// location が提供されている場合、ユーザーは元の目的地にリダイレクトされます
const redirectURL = `${customerInfo.url}/${req.query.location || ''}?jwt_token=${gitbookVisitorJWT}`;
res.redirect(redirectURL);
```

### 5. 適応型コンテンツのためにバックエンドを設定する（オプション）

認証されたアクセス設定で Adaptive Content 機能を活用するには、カスタムバックエンドが生成する JWT のペイロードに追加のユーザー属性（クレーム）を含め、ユーザーをサイトにリダイレクトする際に URL に含めることができます。

これらのクレームは JWT に含められると、GitBook によって [コンテンツを適応させる](https://gitbook-open-v2-preview.gitbook.workers.dev/url/gitbook.com/docs/documentation/ja-gitbook-documentation/publishing-documentation/adaptive-content/adapting-your-content) ために動的に使用されます。

まとめると、次のコード例はこれらのクレームを JWT に含め、それを GitBook が訪問者のためにコンテンツを適応させるために使用できる方法を示しています：

{% code title="index.ts" %}

```typescript
import { Request, Response } from 'express';
import * as jose from 'jose';

import { getUserInfo } from '../services/user-info-service';
import { getFeatureFlags } from '../services/feature-flags-service';

const GITBOOK_VISITOR_SIGNING_KEY = process.env.GITBOOK_VISITOR_SIGNING_KEY!;
const GITBOOK_DOCS_URL = 'https://mycompany.gitbook.io/myspace';

export async function handleAppLoginRequest(req: Request, res: Response) {
    // ログインリクエストを処理するビジネスロジック
    // 例えば、資格情報の確認とユーザーの認証など
    //
    // 例：
    // const loggedInUser = await authenticateUser(req.body.username, req.body.password);
    
    // この例では、ログイン済みのユーザーオブジェクトを想定します
    const loggedInUser = { id: '12345' }; // 実際の認証ロジックに置き換えてください

    // GitBook に渡すためのユーザー情報を取得する
    const userInfo = await getUserInfo(loggedInUser.id);
    
    // 署名済み JWT を生成し、ユーザー属性をクレームとして含める
    const gitbookVisitorClaims = {
        firstName: userInfo.firstName,
        lastName: userInfo.lastName,
        isBetaUser: userInfo.isBetaUser,
        products: userInfo.products.map((product) => product.name),
        featureFlags: await getFeatureFlags({ userId: loggedInUser.id })
    };
    
    const gitbookVisitorJWT = await new jose.SignJWT(gitbookVisitorClaims)
        .setProtectedHeader({ alg: 'HS256' })
        .setIssuedAt()
        .setExpirationTime('2h') // 任意の 2 時間の有効期限
        .sign(new TextEncoder().encode(GITBOOK_VISITOR_SIGNING_KEY));
    
    // JWT トークンを URL に含めてユーザーを GitBook にリダイレクトする
    const redirectURL = `${GITBOOK_DOCS_URL}/?jwt_token=${gitbookVisitorJWT}`;
    res.redirect(redirectURL);
}
```

{% endcode %}

GitBook に送信するための適切なクレームを設定および構成したら、次に進むには「[コンテンツの適応](https://gitbook-open-v2-preview.gitbook.workers.dev/url/gitbook.com/docs/documentation/ja-gitbook-documentation/publishing-documentation/adaptive-content/adapting-your-content)」に移動してサイトの設定を続けてください。
