UNPKG

authrix

Version:

Lightweight, flexible authentication library for Node.js and TypeScript.

2 lines 6.55 kB
import {a}from'./chunk-3SAEGOMQ.mjs';var E="v18.0",d="https://graph.facebook.com",u={AUTHORIZE:"https://www.facebook.com/v18.0/dialog/oauth",TOKEN:`${d}/v18.0/oauth/access_token`,DEBUG_TOKEN:`${d}/debug_token`,ME:`${d}/v18.0/me`,PERMISSIONS:`${d}/v18.0/me/permissions`,DEAUTHORIZE:`${d}/v18.0/me/permissions`},w=["email","public_profile"],k=["id","name","first_name","last_name","middle_name","email","picture.width(400).height(400)","birthday","gender","location","hometown","languages","link","locale","timezone","updated_time","verified","age_range"],l=null;function g(){if(l)return l;let e=process.env.FACEBOOK_APP_ID||process.env.FB_APP_ID,r=process.env.FACEBOOK_APP_SECRET||process.env.FB_APP_SECRET,t=process.env.FACEBOOK_REDIRECT_URI||process.env.FB_REDIRECT_URI,n=process.env.FACEBOOK_API_VERSION||E;if(!e||!r||!t){let o=[];throw e||o.push("FACEBOOK_APP_ID or FB_APP_ID"),r||o.push("FACEBOOK_APP_SECRET or FB_APP_SECRET"),t||o.push("FACEBOOK_REDIRECT_URI or FB_REDIRECT_URI"),new Error(`Missing Facebook OAuth environment variables: ${o.join(", ")}. These are required when using Facebook OAuth functionality. Visit https://developers.facebook.com/apps to create an app and obtain these values.`)}return l={appId:e,appSecret:r,redirectUri:t,apiVersion:n},l}async function h(e,r,t={}){let n=new URL(e);n.searchParams.set("access_token",r);let o=await fetch(n.toString(),{...t,headers:{Accept:"application/json",...t.headers}});if(!o.ok){let a=await o.text(),p=`Facebook API request failed: ${o.status}`;try{let c=JSON.parse(a);if(p=c.error?.message||c.error_description||p,c.error?.code===190)throw new Error("Invalid or expired access token");if(c.error?.code===200)throw new Error("Permission denied")}catch(c){if(c instanceof Error&&c.message.includes("token"))throw c}throw new Error(p)}return o.json()}function O(e={}){let r=g(),t=new URLSearchParams({client_id:r.appId,redirect_uri:e.redirectUri||r.redirectUri,response_type:e.responseType||"code",scope:(e.scopes||w).join(",")});return e.state&&t.set("state",e.state),e.display&&t.set("display",e.display),e.authType&&t.set("auth_type",e.authType),`${u.AUTHORIZE.replace("v18.0",r.apiVersion||"v18.0")}?${t.toString()}`}async function v(e,r={}){let t=g();try{let n=new URL(u.TOKEN.replace("v18.0",t.apiVersion||"v18.0"));n.searchParams.set("client_id",t.appId),n.searchParams.set("client_secret",t.appSecret),n.searchParams.set("code",e),n.searchParams.set("redirect_uri",r.redirectUri||t.redirectUri);let o=await fetch(n.toString());if(!o.ok){let i=await o.text();throw new Error(`Token exchange failed: ${o.status} - ${i}`)}let a=await o.json();if(!a.access_token)throw new Error("No access token received from Facebook");let p=a.access_token,c=a.expires_in;if(r.exchangeForLongLived)try{let i=await y(a.access_token);p=i.access_token,c=i.expires_in;}catch{}let f=new URL(u.ME.replace("v18.0",t.apiVersion||"v18.0"));f.searchParams.set("fields",k.join(","));let s=await h(f.toString(),p),m={id:s.id,email:s.email,username:void 0,name:s.name,avatar:s.picture?.data?.url,provider:"facebook",emailVerified:s.verified||!1,metadata:{firstName:s.first_name,lastName:s.last_name,middleName:s.middle_name,birthday:s.birthday,gender:s.gender,location:s.location?.name,hometown:s.hometown?.name,languages:s.languages?.map(i=>i.name),profileLink:s.link,locale:s.locale,timezone:s.timezone,ageRange:s.age_range,updatedAt:s.updated_time}};if(r.fetchPermissions)try{let i=await F(p);m.metadata.permissions=i;}catch{}if(r.includeTokens){let i=[];try{i=(await _(p)).data.scopes;}catch{}return {...m,tokens:{access:p,expiresIn:c,type:a.token_type,scopes:i}}}return m}catch(n){throw n instanceof Error?n.message.includes("fetch")?new Error("Network error during Facebook authentication. Please try again."):n.message.includes("token")?new Error("Facebook authentication failed. Please try again."):new Error(`Facebook authentication failed: ${n.message}`):new Error("An unexpected error occurred during Facebook authentication.")}}async function y(e){let r=g(),t=new URL(`${d}/oauth/access_token`);t.searchParams.set("grant_type","fb_exchange_token"),t.searchParams.set("client_id",r.appId),t.searchParams.set("client_secret",r.appSecret),t.searchParams.set("fb_exchange_token",e);let n=await fetch(t.toString());if(!n.ok)throw new Error("Failed to exchange for long-lived token");return n.json()}async function _(e,r){let t=g(),n=r||`${t.appId}|${t.appSecret}`,o=new URL(u.DEBUG_TOKEN);o.searchParams.set("input_token",e),o.searchParams.set("access_token",n);let a=await fetch(o.toString());if(!a.ok)throw new Error("Failed to debug token");return a.json()}async function F(e){let r=g();try{return (await h(u.PERMISSIONS.replace("v18.0",r.apiVersion||"v18.0"),e)).data.filter(n=>n.status==="granted").map(n=>n.permission)}catch{return []}}async function T(e,r){let t=g();try{let n=u.DEAUTHORIZE.replace("v18.0",t.apiVersion||"v18.0");r&&(n+=`/${r}`);let o=new URL(n);return o.searchParams.set("access_token",e),(await fetch(o.toString(),{method:"DELETE"})).ok}catch{return false}}async function R(e,r,t){let n=g();try{let o=new URL(`${d}/${n.apiVersion||"v18.0"}/${e}`);return o.searchParams.set("fields",(t||k).join(",")),await h(o.toString(),r)}catch{return null}}async function S(e){try{return (await _(e)).data.is_valid}catch{return false}}function P(){let e=g();return `${e.appId}|${e.appSecret}`}function U(e){let r=new Uint8Array(16);crypto.getRandomValues(r);let t=Array.from(r,n=>n.toString(16).padStart(2,"0")).join("");if(e){let n=JSON.stringify(e),o=btoa(n).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"");return `${t}.${o}`}return t}function I(e){let r=e.split(".");if(r.length===1)return {token:r[0]};try{let t=r[1],n=t+"=".repeat((4-t.length%4)%4),o=atob(n.replace(/-/g,"+").replace(/_/g,"/")),a=JSON.parse(o);return {token:r[0],data:a}}catch{return {token:r[0]}}}async function x(e,r){g();let n=P(),o=new URL(`${d}/${e}/deletions`);o.searchParams.set("access_token",n);let a=await fetch(o.toString(),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({confirmation_code:r})});if(!a.ok)throw new Error("Failed to initiate user data deletion");return a.json()}function L(){l=null;}function $(e){let r=g();return `https://www.facebook.com/v${r.apiVersion||"18.0"}/dialog/oauth/status?client_id=${e||r.appId}`}function C(e,r,t){let n=g(),o=t||n.appSecret;return `sha256=${a("crypto").createHmac("sha256",o).update(r).digest("hex")}`===e} export{O as a,v as b,y as c,_ as d,F as e,T as f,R as g,S as h,P as i,U as j,I as k,x as l,L as m,$ as n,C as o};