跳转到内容
本站为社区维护的非官方中文翻译,与 Cloudflare, Inc. 无关联。本站不提供账户登录,请勿在任何非官方站点输入您的 Cloudflare 账户信息。官方文档:developers.cloudflare.com

可用上下文

最后更新 查看 MarkdownAgent 设置

Gateway 将 context 作为第二个参数传递给 GatewayMiddleware.handle(request, context, next)。上下文描述 Gateway 选择 Forward 策略 时的原始请求。修改 Request 不会更新上下文。

字段名称使用 camelCase。可选字段在不可用时会被省略,空的元数据列表也会被省略。可用性取决于连接方法、目标和已验证会话。使用可选值之前请先检查它们。

TypeScript 类型

在 Worker 项目中安装 @cloudflare/zt-types ↗ 2026.10.1 或更高版本:

npm i -D @cloudflare/zt-types

对 Gateway 类型使用 import type,如示例和每个 Worker 模板所示。这些导入会在 TypeScript 编译时被移除,不会增加运行时依赖。JavaScript 示例省略类型导入和注解,不需要此软件包。该软件包导出以下 Gateway 类型:

类型 说明
GatewayMiddlewareContext 请求元数据、身份 getter 和设备状况 getter。
GatewayMiddlewareNext 通过 Gateway 发送 Request 并返回 Promise<Response> 的延续函数。
GatewayIdentity 由 identity() 返回的用户身份。
GatewayIdentityGroup 用户身份中的组。
GatewayDevicePosture 由 devicePosture() 返回的设备状况。
GatewayDevicePostureChecks 已通过的状况检查标识符。

请求和连接字段

字段 类型 说明
srcIp string Gateway 所见的源 IP 地址。请使用此字段,而不是客户端提供的 IP 标头。
srcPort number 源端口。
dstIp string,可选 目标 IP 地址(如可用)。
dstPort number,可选 目标端口(如可用)。
networkProtocol string 网络传输协议,例如 tcp。
sni string,可选 TLS 连接中的 Server Name Indication。
onrampType string,可选 用于到达 Gateway 的连接方法。
vnetId string,可选 虚拟网络标识符。
proxyEndpoint string,可选 与连接关联的代理端点。
internalSrcIp string,可选 内部源 IP 地址(如可用)。
accountId string Cloudflare 账户标识符。
policyId string 选择此 Worker 的 Forward 策略 UUID。
host string 原始请求主机。
uri string 规范化的原始请求 URL。
embeddedProtocols readonly string[],可选 在 HTTP 流量中检测到的协议。
domainCategories readonly number[],可选 目标域名类别 ID。

context.uri 包含 scheme 和 authority。规范化会移除默认端口和片段、排序查询参数并规范化编码。它可能与 request.url 不同。对请求本身操作时使用 request.url,比较规范化元数据时使用 context.uri。

使用标准 Request API 访问方法、标头、cookie 和正文。上下文不包含自定义函数结果、DLP 匹配详细信息或原始内部设备记录。

身份

仅当你的脚本需要与 Gateway 会话关联的身份时,才调用 await context.identity()。其返回类型为 Promise<GatewayIdentity | null>。

await 后的调用行为如下:

  • 当用户已识别时返回身份对象。
  • 没有已识别用户时返回 null。
  • 如果 Gateway 无法检索身份,则抛出错误。
字段 类型 说明
email string,可选 用户电子邮件地址。
name string,可选 用户显示名称。
groups readonly GatewayIdentityGroup[],可选 组成员资格。每个组可以有可选的 id、email 和 name 字段。
samlAttributes readonly string[],可选 与身份关联的 SAML 属性。
oidcClaims readonly string[],可选 与身份关联的 OIDC claims。这是列表,而不是已解码的 token 对象。

使用 Gateway 提供的身份进行感知用户的逻辑。客户端提供的身份标头不是权威替代。

检查缺失身份(!identity)以明确允许或拒绝匿名流量。

设备状况

调用 await context.devicePosture() 以检索已通过的状况检查标识符:

{
	"checks": {
		"passed": ["<POSTURE_CHECK_UUID>"]
	}
}

checks.passed 是状况检查 UUID 的只读列表。空数组表示没有检查通过。当没有注册设备时,getter 解析为 { checks: { passed: [] } }。要求特定已通过检查的 Worker 必须拒绝此请求。

如果 Gateway 无法检索设备状况,await devicePosture() 会抛出错误。请将其与没有任何已通过检查的会话分开处理。

getter 不返回原始测试结果或失败检查列表。

处理身份和状况错误

即使 Gateway 无法检索身份或设备状况,仍会调用 Worker。如果任一 await 调用抛出错误且你的 Worker 未捕获该错误,Gateway 会返回 HTTP 500。

使用 try/catch 选择 Worker 如何处理这些错误。示例对检索错误返回 HTTP 503,在身份或所需状况检查缺失时返回 HTTP 403。

如果你的应用程序在 Gateway 无法检索身份或状况时有意允许流量,请从 catch 块返回 next(request)。这将在不要求缺失结果的情况下继续请求。

仅在调用 next() 之前使用此方法。每次调用最多调用一次 next()。

示例

此脚本在继续之前要求身份电子邮件和特定已通过的状况检查。匿名流量和没有所需检查的设备会收到合成 403 响应。

身份或状况检索错误会收到 503。将 <POSTURE_CHECK_UUID> 替换为你账户中的检查。

src/index.jsjs
import { WorkerEntrypoint } from "cloudflare:workers";

export class GatewayMiddleware extends WorkerEntrypoint {
	async handle(request, context, next) {
		try {
			const identity = await context.identity();
			if (!identity?.email) {
				return new Response(null, { status: 403 });
			}
			const passed = (await context.devicePosture())?.checks.passed ?? [];
			if (!passed.includes("<POSTURE_CHECK_UUID>")) {
				return new Response(null, { status: 403 });
			}
		} catch {
			return new Response(null, { status: 503 });
		}
		return next(request);
	}
}
src/index.tsts
import { WorkerEntrypoint } from "cloudflare:workers";
import type {
	GatewayMiddlewareContext,
	GatewayMiddlewareNext,
} from "@cloudflare/zt-types";

export class GatewayMiddleware extends WorkerEntrypoint {
	async handle(
		request: Request,
		context: GatewayMiddlewareContext,
		next: GatewayMiddlewareNext,
	): Promise<Response> {
		try {
			const identity = await context.identity();
			if (!identity?.email) {
				return new Response(null, { status: 403 });
			}
			const passed = (await context.devicePosture())?.checks.passed ?? [];
			if (!passed.includes("<POSTURE_CHECK_UUID>")) {
				return new Response(null, { status: 403 });
			}
		} catch {
			return new Response(null, { status: 503 });
		}
		return next(request);
	}
}

当可以使用内置身份选择器或设备状况选择器表达要求时,请在 Gateway 过滤策略中配置它。对需要自定义代码的要求使用 Worker 逻辑。

标头表示

Gateway 用分号合并重复的 Cookie 标头,用逗号合并其他重复标头。Set-Cookie 值保留单独条目。使用 response.headers.getSetCookie() 读取各个响应 cookie。修改标头时,使用 new Headers(response.headers) 复制它们以保留其表示。

这篇文档对您有帮助吗?