🌊
【備忘録】Cloudflare Accessで、使用したメールアドレスを取得する方法
なんで?
先日、Cloudflare Accessでアクセス制限をかけたWebページ上で、さらにメールアドレスを入力させる実装をやりかけた時に思いつきました。
「あれ、Cloudflare Accessからメアドって取れないのかな」と。
結論
私のようなせっかちな人のために結論から。
①CookieからCF_Authorization
の内容をとってくる
②それをhttps://*.cloudflareaccess.com/cdn-cgi/access/certs
(*は組織名)からリモートの JSON Web Key Set (JWKS) を取得する。
なお、これをやるには以下の2つが必要です。
- TEAM_DOMAIN(先程の*の部分)
- POLICY_AUD
POLICY_AUDはCFのコンソールから見ることができます。
対象のアプリケーションの部分から
一番下のAUDを持ってきます。良い子も悪い子もどっちでも無い子もシークレットに置きましょうね。
③検証が成功すると、JWT のペイロードが返されるのでそれの中からresult.payload.email
を持ってくる
という感じです。
サンプルはこんな感じ。
import { jwtVerify, createRemoteJWKSet } from "jose";
//中略
const TEAM_DOMAIN = process.env.REACT_APP_TEAM_DOMAIN;
const AUD = process.env.REACT_APP_POLICY_AUD;
//中略
const token = Cookies.get("CF_Authorization");
let cfEmail = null;
if (token) {
const JWKS = createRemoteJWKSet(
new URL(`https://*.cloudflareaccess.com/cdn-cgi/access/certs`)
);
const result = await jwtVerify(token, JWKS, {
issuer: TEAM_DOMAIN,
audience: AUD,
});
cfEmail = result.payload.email;
}
CF-Access-Authenticated-User-Email使うとか書いてる記事やStackOverFlowを見ましたが、どれもうまくいきませんでした。色々調べたり生成したらこれが出てきました。詳細は後々調査しようかなと。
しかし、ドキュメントにそれらしきものがない(検証する部分は書いてるがそこからメアドが取れるとは書いてない...?)のでだいぶ迷いました。
認証認可周りは素人なのでおそらく根本的に違うことを書いている可能性があります。
コメントでのご指摘お待ちしております。
では。
Discussion