> For the complete documentation index, see [llms.txt](https://gitbook.com/docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://gitbook.com/docs/documentation/ja-gitbook-documentation/publish/site-audience/authenticated-access/setting-up-a-custom-backend.md).

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

ドキュメント閲覧者向けにカスタムログイン画面を設定します

{% hint style="warning" %}
このガイドでは、ドキュメント用の保護されたサインイン画面の設定方法を説明します。このガイドを進める前に、まず [認証済みアクセスを有効にする](/docs/documentation/ja-gitbook-documentation/publish/site-audience/authenticated-access/enabling-authenticated-access.md).
{% endhint %}

このガイドでは、独自の **カスタム** 認証バックエンドを使用して、GitBook のドキュメントサイト用の保護されたサインイン画面を設定する方法を説明します。

{% hint style="info" %}
サポート対象の認証プロバイダーのいずれかを使用している場合、または [OpenID Connect](https://auth0.com/docs/authenticate/protocols/openid-connect-protocol) （OIDC）準拠のバックエンドをお持ちの場合は、より簡単に設定できる統合ガイドをご覧ください。\
\
[Auth0](/docs/documentation/ja-gitbook-documentation/publish/site-audience/authenticated-access/setting-up-auth0.md) | [Azure AD](/docs/documentation/ja-gitbook-documentation/publish/site-audience/authenticated-access/setting-up-azure-ad.md) | [Okta](/docs/documentation/ja-gitbook-documentation/publish/site-audience/authenticated-access/setting-up-okta.md) | [AWS Cognito](/docs/documentation/ja-gitbook-documentation/publish/site-audience/authenticated-access/setting-up-aws-cognito.md) | [OIDC](/docs/documentation/ja-gitbook-documentation/publish/site-audience/authenticated-access/setting-up-oidc.md)
{% 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-login-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）** 認証成功時に。
* URL に JWT を含めてユーザーを GitBook にリダイレクトする。

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

バックエンドがユーザーを認証したら、 **JWT を生成し** と **GitBook に渡して** ブロックの **リダイレクトし** サイトへ戻します。トークンは、 **秘密鍵** を使って署名する必要があり、これは [認証済みアクセスを有効にする](/docs/documentation/ja-gitbook-documentation/publish/site-audience/authenticated-access/enabling-authenticated-access.md#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));
    
    // URL に JWT トークンを含めてユーザーを GitBook にリダイレクトする
    const redirectURL = `${GITBOOK_DOCS_URL}/?jwt_token=${gitbookVisitorJWT}`;
    res.redirect(redirectURL);
}
```

{% endcode %}

#### GitBook セッションから訪問者をログアウトさせる

訪問者を GitBook セッションからサインアウトさせるには、サイト URL に `~gitbook/auth/logout` を付けてリダイレクトします。

`https://mycompany.gitbook.io/myspace/~gitbook/auth/logout`

このエンドポイントは、訪問者を GitBook からのみサインアウトさせます。独自の ID プロバイダーからもサインアウトさせたい場合は、ログアウトフロー内で別途処理してください。

### 3. ログイン URL を設定する

ログイン URL は、未認証の訪問者が保護されたサイトにアクセスしようとしたときに使用されます。その後、GitBook はその訪問者をこの URL にリダイレクトします。

この URL は、カスタムバックエンド内のハンドラーを指す必要があります。そこでログインを促し、認証したうえで、JWT を URL に含めてサイトへ戻すようにリダイレクトできます。

たとえば、ログイン画面が `https://example.com/login`にある場合、この値をログイン URL として指定します。

このログイン URL は、サイトの audience 設定の「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&amp;token=e22fe867-e1f6-44f7-8b4f-a868ac620464" alt="A GitBook screenshot showing where to configure a login URL"><figcaption><p>ログイン URL を設定する</p></figcaption></figure>

#### GitBook のログインエンドポイントを使用する

公開サイトにサインインリンクを置きたい場合は、 `<publishedSiteURL>/~gitbook/auth/login`.

にリンクしてください。このエンドポイントは、訪問者をサイト用に設定された認証バックエンドへリダイレクトします。また、 `location` を追加し、開始元のページと一致させます。

これは、ヘッダーリンクや、サインイン後に同じページへ戻したいその他の प्रवेश点に便利です。

ログイン 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));
    
// 元の GitBook ドキュメント URL に、jwt_token クエリパラメータとして JWT を含めてリダイレクトする
// 場所が指定されている場合、ユーザーは元の目的地に戻される
const redirectURL = `${GITBOOK_DOCS_URL}/${req.query.location || ''}?jwt_token=${gitbookVisitorJWT}`;
res.redirect(redirectURL);
```

{% hint style="warning" %}
GitBook は `location` search param に依存しているため、ログイン URL では使用できません。たとえば、 `https://auth.gitbook.com/?location=something` は有効なログイン URL ではありません。
{% endhint %}

#### MCP 認可リクエストをリダイレクトする

訪問者が公開ドキュメントの [MCPサーバー](/docs/documentation/ja-gitbook-documentation/ai-for-your-readers/mcp-servers-for-published-docs.md) に接続すると、GitBook はその訪問者を認証バックエンドにリダイレクトします。リダイレクトには、 `location` MCP 認可エンドポイントのパスを含むパラメータが含まれ、そこには `gb_oauth_state` の値が入ります。たとえば次のようになります。

```
~gitbook/oauth2/v1/<site-id>/authorize?gb_oauth_state=<consent_state>
```

バックエンドは、このパスを使って GitBook サイトへ戻る最終的なリダイレクト先を組み立てる必要があります。

GitBook はサイトの設定に応じて、次の2つのエンドポイントのいずれかからこのフローを開始します。

* `~gitbook/mcp/auth` アダプティブコンテンツが有効な部分認証済みサイト用。
* `~gitbook/mcp` 認証済みアクセスを使用するサイト用。

バックエンドが訪問者の認証を完了したら、 `location` を GitBook サイトのベース URL に追加して戻り先 URL を作成します。 `gb_oauth_state` クエリパラメータはそのままにして、 `jwt_token=<token>` パラメータとして、バックエンドが生成した署名付き JWT を追加します。

バックエンドが訪問者をリダイレクトする最終的な URL は、次のようになります。

```
https://<publishedSiteURL>/~gitbook/oauth2/v1/<site-id>/authorize?gb_oauth_state=<consent_state>&jwt_token=<token>
```

#### GitBook のログアウトエンドポイントを使用する

公開サイトにサインアウトリンクを置きたい場合は、 `<publishedSiteURL>/~gitbook/auth/logout`.

にリンクしてください。このエンドポイントは、訪問者を GitBook セッションからサインアウトさせます。

### 4. マルチテナントの認証済みアクセスを設定する（任意）

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

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

認証バックエンドは、JWT 署名キーと、処理対象の GitBook サイトすべての 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 を次のように設定できます。

その後、認証バックエンドはこの情報を確認し、それに応じて正しいサイトへのリダイレクトを処理できます。

```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));
    
// 元の GitBook ドキュメント URL に、jwt_token クエリパラメータとして JWT を含めてリダイレクトする
// 場所が指定されている場合、ユーザーは元の目的地に戻される
const redirectURL = `${customerInfo.url}/${req.query.location || ''}?jwt_token=${gitbookVisitorJWT}`;
res.redirect(redirectURL);
```

### 5. アダプティブコンテンツ用にバックエンドを設定する（任意）

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

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

まとめると、次のコード例は、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));
    
    // URL に JWT トークンを含めてユーザーを GitBook にリダイレクトする
    const redirectURL = `${GITBOOK_DOCS_URL}/?jwt_token=${gitbookVisitorJWT}`;
    res.redirect(redirectURL);
}
```

{% endcode %}

GitBook に送る適切なクレームを設定して構成したら、「[コンテンツの適応](/docs/documentation/ja-gitbook-documentation/publish/adaptive-content/adapting-your-content.md)」へ進み、サイトの設定を続けてください。


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://gitbook.com/docs/documentation/ja-gitbook-documentation/publish/site-audience/authenticated-access/setting-up-a-custom-backend.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
