跳转到内容
搜索文档

Cloudflare Access

最后更新 查看 MarkdownAgent 设置

Cloudflare Access Pages Plugin 是一个中间件,用于验证 Cloudflare Access JWT 断言。它还包含 API,用于查找给定用户 JWT 的附加信息。

安装

npm i @cloudflare/pages-plugin-cloudflare-access

用法

import cloudflareAccessPlugin from "@cloudflare/pages-plugin-cloudflare-access";

export const onRequest: PagesFunction = cloudflareAccessPlugin({
	domain: "https://test.cloudflareaccess.com",
	aud: "4714c1358e65fe4b408ad6d432a5f878f08194bdb4752441fd56faefa9b2b6f2",
});

Plugin 接受一个包含两个属性的对象:Cloudflare Access 账户的 domain 和要验证的策略 aud(audience)。任何验证失败的请求将返回 403 状态码。

访问 JWT 载荷

如果需要在应用中使用 JWT 载荷(例如需要用户的电子邮件地址),此 Plugin 将在 data.cloudflareAccess.JWT.payload 处提供。

例如:

import type { PluginData } from "@cloudflare/pages-plugin-cloudflare-access";

export const onRequest: PagesFunction<unknown, any, PluginData> = async ({
	data,
}) => {
	return new Response(
		`Hello, ${data.cloudflareAccess.JWT.payload.email || "service user"}!`,
	);
};

完整的 JWT 载荷 将在 data.cloudflareAccess.JWT.payload 上可用。请注意,身份授权(例如浏览器中的用户)和非身份授权(例如服务令牌)之间可用字段不同。

查找身份

要获取有关给定用户身份的更多信息,请使用提供的 getIdentity API 函数:

import { getIdentity } from "@cloudflare/pages-plugin-cloudflare-access/api";

export const onRequest: PagesFunction = async ({ data }) => {
	const identity = await getIdentity({
		jwt: "eyJhbGciOiJIUzI1NiIsImtpZCI6IjkzMzhhYmUxYmFmMmZlNDkyZjY0NmE3MzZmMjVhZmJmN2IwMjVlMzVjNjI3YmU0ZjYwYzQxNGQ0YzczMDY5YjgiLCJ0eXAiOiJKV1QifQ.eyJhdWQiOlsiOTdlMmFhZTEyMDEyMWY5MDJkZjhiYzk5ZmMzNDU5MTNhYjE4NmQxNzRmMzA3OWVhNzI5MjM2NzY2YjJlN2M0YSJdLCJlbWFpbCI6ImFkbWluQGV4YW1wbGUuY29tIiwiZXhwIjoxNTE5NDE4MjE0LCJpYXQiOjE1MTkzMzE4MTUsImlzcyI6Imh0dHBzOi8vdGVzdC5jbG91ZGZsYXJlYWNjZXNzLmNvbSIsIm5vbmNlIjoiMWQ4MDgzZjcwOGE0Nzk4MjI5NmYyZDk4OTZkNzBmMjA3YTI3OTM4ZjAyNjU0MGMzOTJiOTAzZTVmZGY0ZDZlOSIsInN1YiI6ImNhNjM5YmI5LTI2YWItNDJlNS1iOWJmLTNhZWEyN2IzMzFmZCJ9.05vGt-_0Mw6WEFJF3jpaqkNb88PUMplsjzlEUvCEfnQ",
		domain: "https://test.cloudflareaccess.com",
	});

	return new Response(`Hello, ${identity.name || "service user"}!`);
};

getIdentity 函数接受一个包含两个属性的对象:jwt 字符串和 domain 字符串。它返回 /cdn-cgi/access/get-identity 端点返回的对象Promise。如果要使用用户的组成员身份进行应用权限等操作,这特别有用。

为方便起见,可以使用 data.cloudflareAccess.JWT.getIdentity 函数获取当前请求 JWT 的相同信息(假设你已使用上述 Plugin 验证请求):

import type { PluginData } from "@cloudflare/pages-plugin-cloudflare-access";

export const onRequest: PagesFunction<unknown, any, PluginData> = async ({
	data,
}) => {
	const identity = await data.cloudflareAccess.JWT.getIdentity();

	return new Response(`Hello, ${identity.name || "service user"}!`);
};

登录和注销 URL

如果要强制登录或注销,请使用这些实用函数生成 URL 并重定向用户:

import { generateLoginURL } from "@cloudflare/pages-plugin-cloudflare-access/api";

export const onRequest = () => {
	const loginURL = generateLoginURL({
		redirectURL: "https://example.com/greet",
		domain: "https://test.cloudflareaccess.com",
		aud: "4714c1358e65fe4b408ad6d432a5f878f08194bdb4752441fd56faefa9b2b6f2",
	});

	return new Response(null, {
		status: 302,
		headers: { Location: loginURL },
	});
};
import { generateLogoutURL } from "@cloudflare/pages-plugin-cloudflare-access/api";

export const onRequest = () =>
	new Response(null, {
		status: 302,
		headers: {
			Location: generateLogoutURL({
				domain: "https://test.cloudflareaccess.com",
			}),
		},
	});

这篇文档对您有帮助吗?