UNPKG

@localsecurity/cf-access-service

Version:

A utility to parse Cloudflare Access user identity inside Cloudflare Workers

61 lines (60 loc) 2.28 kB
/** * A class to validate incomming requests * @method getIdentity - Returns a parsed CFAccessUserIdentity object if the user is logged in * @method getEmail - Returns the users Email if the user is logged in */ class CFAccessService { /** * Returns a parsed CFAccessUserIdentity object if the user is logged in * @param {Request} request - the incomming request to validate * @param {Env} env - environment object * @returns {Partial<CFAccessUserIdentity>} The users identity */ async getIdentity(request, env) { const formatID = (data) => { let N = (d, k) => T(d[k], 'number'); let S = (d, k) => T(d[k], 'string'); let B = (d, k) => T(d[k], 'boolean'); let T = (i, t) => (typeof i === t ? i : void 0); return { id: S(data, 'id'), ip: S(data, 'ip'), idp: S(data, 'idp'), iat: N(data, 'iat'), name: S(data, 'name'), email: S(data, 'email'), is_warp: B(data, 'is_warp'), is_gateway: B(data, 'is_gateway'), auth_status: S(data, 'auth_status'), service_token_id: S(data, 'service_token_id'), service_token_status: B(data, 'service_token_status'), }; }; let id; const team = env['WORKSPACE'] ? env['WORKSPACE'] : 'example-ls'; const suffix = 'cloudflareaccess.com/cdn-cgi/access/get-identity'; const url = new URL(`https://${team}.${suffix}`); const resp = await fetch(url, request.clone()); const data = await resp.json(); if (data) id = formatID(data); else id = { email: '' }; return id; } /** * Returns the users Email if the user is logged in * @param {Request} request - the incomming request to validate * @param {Env} env - environment object * @returns The users email or null */ async getEmail(request, env) { const id = await this.getIdentity(request, env); const email = id['email']; if (email) return email; return null; } } export { CFAccessService }; export default CFAccessService;