设置自定义后端

为访问您文档的访客设置自定义登录界面

本指南将引导您使用自定义 自定义 认证后端,为您的 GitBook 文档站点设置受保护的登录界面。

如果您正在使用我们支持的某个身份验证提供商,或拥有一个 OpenID Connect (OIDC) 兼容的后端,请查看我们的集成指南以获得更简化的设置: Auth0 | Azure AD | Okta | AWS Cognito | OIDC

概述

要为您的 GitBook 站点设置自定义身份验证系统,请遵循以下关键步骤:

1

创建自定义后端以验证您的用户

实现一个提示用户登录并对其进行身份验证的后端。

2

签署并传递 JWT 令牌给 GitBook

创建一个 JWT 令牌并使用您站点的私钥对其进行签名。

3

配置后备 URL

配置在未认证访客访问您站点时使用的 URL。

4

设置多租户认证访问(可选)

配置您的后端以处理多个 GitBook 站点的身份验证。

5

为自适应内容配置您的后端(可选)

配置您的后端以配合 GitBook 中的自适应内容。

1. 创建自定义后端以验证您的用户

为了在用户访问文档之前对其进行身份验证,您需要设置一个能够处理用户登录和身份验证的服务器。

您的后端应当:

  • 提示用户使用您偏好的身份验证方法登录。

  • 验证用户凭据并对其进行身份验证。

  • 生成并签署一个 JSON Web 令牌 (JWT) 在验证成功后。

  • 将用户重定向到包含 JWT 的 GitBook。

2. 签署并传递 JWT 令牌给 GitBook

一旦您的后端对用户进行身份验证,它必须 生成一个 JWT 并且 在重定向到 GitBook 时将其传递给 GitBook将他们重定向到您的站点。该令牌应使用 私钥 对其进行签名, 该私钥可在您站点的受众设置中找到,位于 启用认证访问.

下面的示例演示了自定义后端中登录请求处理程序可能的实现方式:

index.ts
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') // 任意的两小时过期
        .sign(new TextEncoder().encode(GITBOOK_VISITOR_SIGNING_KEY));
    
    // 在 URL 中包含 JWT 令牌并将用户重定向到 GitBook
    const redirectURL = `${GITBOOK_DOCS_URL}/?jwt_token=${gitbookVisitorJWT}`;
    res.redirect(redirectURL);
}

3. 配置后备 URL

后备 URL 在未认证的访客尝试访问受保护站点时使用。GitBook 会将他们重定向到该 URL。

该 URL 应指向您自定义后端中的处理器,您可以在该处提示他们登录、进行身份验证,然后在 URL 中包含 JWT 后将他们重定向回您的站点。

例如,如果您的登录界面位于 https://example.com/login, 您应将此值作为后备 URL 包含。

您可以在站点的“受众设置”中的“已认证访问”选项卡里配置此后备 URL。

A GitBook screenshot showing where to configure a fallback URL
配置后备 URL

在重定向到后备 URL 时,GitBook 会包含一个 location 查询参数到后备 URL,您可以在处理程序中利用该参数将用户重定向回其原始位置:

const gitbookVisitorJWT = await new jose.SignJWT({})
    .setProtectedHeader({ alg: 'HS256' })
    .setIssuedAt()
    .setExpirationTime('2h') // 任意的两小时过期
    .sign(new TextEncoder().encode(GITBOOK_VISITOR_SIGNING_KEY));
    
// 将用户重定向到包含 jwt_token 查询参数的原始 GitBook 文档 URL
// 如果提供了 location,则用户将被重定向回其原始目的地
const redirectURL = `${GITBOOK_DOCS_URL}/${req.query.location || ''}?jwt_token=${gitbookVisitorJWT}`;
res.redirect(redirectURL);

4. 设置多租户认证访问(可选)

如果您将 GitBook 用作向不同客户提供内容的平台,您可能需要设置多租户认证访问。您的身份验证后端需要负责处理多个不同站点的认证。在 GitBook 中,通过对自定义身份验证后端代码进行少量调整即可实现此功能。

将所有租户添加到您的身份验证服务器

您的身份验证后端需要知道 JWT 签名密钥以及您期望其处理的所有 GitBook 站点的 URL。如果您在组织中有为客户 A 和客户 B 提供的两个站点,您可以想象身份验证代码存储这样的映射:

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:

GitBook 站点
后备 URL

客户 A 站点

https://auth-backend.acme.org/login?site=customer-a

客户 B 站点

https://auth-backend.acme.org/login?site=customer-b

然后您的身份验证后端可以检查此信息并相应地将用户重定向到正确的站点:

const customerInfo = req.query.site === 'customer-a' ? CUSTOMER_A : CUSTOMER_B;
  
const gitbookVisitorJWT = await new jose.SignJWT({})
    .setProtectedHeader({ alg: 'HS256' })
    .setIssuedAt()
    .setExpirationTime('2h') // 任意的两小时过期
    .sign(new TextEncoder().encode(customerInfo.jwtSigningKey));
    
// 将用户重定向到包含 jwt_token 查询参数的原始 GitBook 文档 URL
// 如果提供了 location,则用户将被重定向回其原始目的地
const redirectURL = `${customerInfo.url}/${req.query.location || ''}?jwt_token=${gitbookVisitorJWT}`;
res.redirect(redirectURL);

5. 为自适应内容配置您的后端(可选)

若要在您的认证访问设置中利用自适应内容功能,您可以在自定义后端生成并在重定向用户到站点时随 URL 一并包含的 JWT 负载中加入额外的用户属性(声明)。

这些声明在包含于 JWT 时,会被 GitBook 用来 为您的站点访问者自适应内容 动态调整。

综合起来,下面的代码示例演示了如何在 JWT 中包含这些声明,GitBook 随后可使用这些声明为访问者自适应内容:

index.ts
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') // 任意的两小时过期
        .sign(new TextEncoder().encode(GITBOOK_VISITOR_SIGNING_KEY));
    
    // 在 URL 中包含 JWT 令牌并将用户重定向到 GitBook
    const redirectURL = `${GITBOOK_DOCS_URL}/?jwt_token=${gitbookVisitorJWT}`;
    res.redirect(redirectURL);
}

在设置并配置好要发送给 GitBook 的声明后,前往“自适应您的内容”以继续配置您的站点。

最后更新于

这有帮助吗?