INTEGRITY Документация

Cloudflare Access

Cloudflare Access Pages Plugin представляет собой промежуточное ПО для проверки утверждений JWT Cloudflare Access. Он также включает 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",
});

Плагин принимает объект с двумя свойствами: domain вашего аккаунта Cloudflare Access, а также политику aud (audience) для проверки. Для любых запросов, не прошедших проверку, будет возвращен 403 код состояния.

Доступ к полезной нагрузке JWT

Если вам нужно использовать payload JWT в приложении (например, вам нужен email-адрес пользователя), этот 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"}!`,
	);
};

весь payload 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 строку. Она возвращает Promise объект, возвращаемый /cdn-cgi/access/get-identity конечная точка. Это особенно полезно, если вы хотите использовать членство пользователя в группе, например, для управления правами доступа в приложении.

Для удобства эту же информацию можно получить для JWT текущего запроса с помощью data.cloudflareAccess.JWT.getIdentity функция (при условии, что вы уже проверили запрос с помощью 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",
			}),
		},
	});