Cloudflare Access
Cloudflare Access Pages Pluginは、Cloudflare Access JWTアサーションを検証するためのミドルウェアです。また、特定のユーザーのJWTに関する追加情報を検索するためのAPIも含まれています。
npm install @cloudflare/pages-plugin-cloudflare-accessimport cloudflareAccessPlugin from "@cloudflare/pages-plugin-cloudflare-access";
export const onRequest: PagesFunction = cloudflareAccessPlugin({ domain: "https://test.cloudflareaccess.com", aud: "4714c1358e65fe4b408ad6d432a5f878f08194bdb4752441fd56faefa9b2b6f2",});このプラグインは、Cloudflare Accessアカウントのdomainと、検証対象のポリシーaud(オーディエンス)を含むオブジェクトを受け取ります。検証に失敗したリクエストには、403ステータスコードが返されます。
アプリケーションでJWTペイロードを使用する必要がある場合(たとえば、ユーザーのメールアドレスが必要な場合)、このプラグインは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( `こんにちは、${data.cloudflareAccess.JWT.payload.email || "サービスユーザー"}さん!`, );};全ての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(`こんにちは、${identity.name || "サービスユーザー"}さん!`);};getIdentity関数は、jwt文字列とdomain文字列を含むオブジェクトを受け取ります。これは、 /cdn-cgi/access/get-identityエンドポイントから返されるオブジェクトのPromiseを返します。これは、ユーザーのグループメンバーシップをアプリケーションの権限などに使用したい場合に特に便利です。
便利なことに、この同じ情報は、data.cloudflareAccess.JWT.getIdentity関数を使用して現在のリクエストのJWTに対して取得できます(上記のようにプラグインでリクエストを検証していると仮定します):
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(`こんにちは、${identity.name || "サービスユーザー"}さん!`);};ログインまたはログアウトを強制したい場合は、これらのユーティリティ関数を使用して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", }), }, });