Cloudflare Access delivers JWTs via:
Cf-Access-Jwt-Assertionheader (API clients)CF_Authorizationcookie (browsers)
This example shows how to validate both.
Get your Cloudflare Access settings:
export CF_TEAM_DOMAIN="your-team.cloudflareaccess.com"
export CF_AUD="your-application-aud-tag"Run the example:
cargo run --example cloudflareExtract a token from a logged-in browser session (DevTools → Application → Cookies), then:
# Via header
curl -H "Cf-Access-Jwt-Assertion: eyJhbGc..." \
http://localhost:3000/api/header
# Via cookie
curl -H "Cookie: CF_Authorization=eyJhbGc..." \
http://localhost:3000/api/cookieDefine extractors:
define_header_extractor!(CfAccessJwtHeader, "cf-access-jwt-assertion");
define_cookie_extractor!(CfAuthCookie, "CF_Authorization");Use in handlers:
async fn header_route(
user: Claims<CloudflareAccessClaims, HeaderTokenExtractor<CfAccessJwtHeader>>
) -> Json<CloudflareAccessClaims> {
Json(user.claims)
}
async fn cookie_route(
user: Claims<CloudflareAccessClaims, CookieTokenExtractor<CfAuthCookie>>
) -> Json<CloudflareAccessClaims> {
Json(user.claims)
}Configure JWKS validation:
let jwks_url = format!("https://{}/cdn-cgi/access/certs", team_domain);
let mut validation = Validation::new(Algorithm::RS256);
validation.set_audience(&[&audience]);
validation.set_issuer(&[&format!("https://{}", team_domain)]);
let decoder = RemoteJwksDecoder::builder()
.jwks_url(jwks_url)
.validation(validation)
.build()?;GET /- Public (no auth)GET /api/header- Header authGET /api/cookie- Cookie authGET /api/user- User info