tokenidp-react 0.3.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/AuthProvider.jsx","../src/config.js","../src/storage.js","../src/pkce.js","../src/tenant.js","../src/oauth.js","../src/authApi.js","../src/AuthCallback.jsx","../src/LoginPage.jsx"],"sourcesContent":["import React, {\r\n createContext,\r\n useContext,\r\n useEffect,\r\n useMemo,\r\n useReducer,\r\n useRef,\r\n} from \"react\";\r\nimport { defaultAuthConfig } from \"./config\";\nimport { createStorage } from \"./storage\";\nimport { generateCodeVerifier, generateCodeChallenge } from \"./pkce\";\nimport { buildAuthorizeUrl, randomState } from \"./oauth\";\nimport {\n getApiTenantKey,\n normalizeTenantPropagationMode,\n resolveApiTenantKey,\n resolveAuthTenantKey,\n} from \"./tenant\";\nimport {\n exchangeAuthorizationCode,\n refreshWithToken,\n revokeToken,\n extractToken,\n buildLogoutUrl,\n} from \"./authApi\";\n\r\nconst AuthContext = createContext(null);\r\n\r\nconst initialState = {\n isAuthenticated: false,\n tenantKey: \"\",\n landingPage: \"\",\n accessToken: \"\",\n refreshToken: \"\",\n idToken: \"\",\n expiresAt: 0,\n error: \"\",\n};\n\r\nfunction reducer(state, action) {\r\n switch (action.type) {\r\n case \"LOGIN_SUCCESS\":\r\n return {\r\n ...state,\r\n ...action.payload,\r\n isAuthenticated: true,\r\n error: \"\",\r\n };\r\n case \"SET_ERROR\":\r\n return { ...state, error: action.payload || \"Unknown error\" };\r\n case \"LOGOUT\":\r\n return { ...initialState };\r\n case \"TOKENS_UPDATED\":\r\n return { ...state, ...action.payload };\r\n default:\r\n return state;\r\n }\r\n}\r\n\r\nexport function IdpAuthProvider({ children, config }) {\n const baseConfig = useMemo(\n () => ({ ...defaultAuthConfig, ...(config || {}) }),\n [config],\n );\n\n const storage = useMemo(\n () => createStorage(baseConfig.storage),\n [baseConfig.storage],\n );\n\n const persistedRaw = storage.getItem(baseConfig.storageKey);\n const persisted = persistedRaw ? safeJsonParse(persistedRaw) : null;\n\n const mergedConfig = useMemo(() => {\n const normalizedConfig = {\n ...baseConfig,\n tenantPropagationMode: normalizeTenantPropagationMode(\n baseConfig?.tenantPropagationMode,\n ),\n };\n const resolvedTenantKey =\n resolveApiTenantKey(normalizedConfig) ||\n getApiTenantKey({\n ...normalizedConfig,\n tenantKey: persisted?.tenantKey,\n });\n\n return {\n ...normalizedConfig,\n tenantKey: resolvedTenantKey,\n };\n }, [baseConfig, persisted?.tenantKey]);\n\n const [state, dispatch] = useReducer(\n reducer,\n buildInitialState(persisted, mergedConfig),\n );\n\r\n useEffect(() => {\r\n storage.setItem(mergedConfig.storageKey, JSON.stringify(state));\r\n }, [state, storage, mergedConfig.storageKey]);\r\n\r\n const refreshTimerRef = useRef(null);\r\n const refreshInFlightRef = useRef(false);\r\n\r\n function clearRefreshTimer() {\r\n if (refreshTimerRef.current) {\r\n clearTimeout(refreshTimerRef.current);\r\n refreshTimerRef.current = null;\r\n }\r\n }\r\n\r\n function clearLocalSession() {\n storage.removeItem(mergedConfig.storageKey);\n sessionStorage.removeItem(mergedConfig.pkceVerifierKey);\n sessionStorage.removeItem(mergedConfig.oauthStateKey);\n sessionStorage.removeItem(mergedConfig.tenantKeyStorageKey);\n dispatch({ type: \"LOGOUT\" });\n }\n\r\n async function tryRefreshWithRetry(retries, retryDelayMs) {\r\n try {\r\n await api.refresh();\r\n return true;\r\n } catch (err) {\r\n if (retries > 0) {\r\n await new Promise((res) => setTimeout(res, retryDelayMs));\r\n return tryRefreshWithRetry(retries - 1, retryDelayMs);\r\n }\r\n return false;\r\n }\r\n }\r\n\r\n function scheduleAutoRefresh(nextExpiresAtMs) {\r\n clearRefreshTimer();\r\n if (!mergedConfig.autoRefresh || !nextExpiresAtMs) return;\r\n\r\n const skewMs = (mergedConfig.refreshSkewSeconds || 60) * 1000;\r\n const delay = Math.max(0, nextExpiresAtMs - Date.now() - skewMs);\r\n\r\n refreshTimerRef.current = setTimeout(async () => {\r\n if (refreshInFlightRef.current) return;\r\n refreshInFlightRef.current = true;\r\n\r\n const ok = await tryRefreshWithRetry(1, 5000); // 👈 1 retry\r\n\r\n refreshInFlightRef.current = false;\r\n\r\n if (!ok) {\r\n api.logout();\r\n }\r\n }, delay);\r\n }\r\n\r\n useEffect(() => {\r\n if (!state.isAuthenticated || !state.expiresAt) return;\r\n scheduleAutoRefresh(state.expiresAt);\r\n return () => {\r\n clearRefreshTimer();\r\n };\r\n }, [state.isAuthenticated, state.expiresAt]);\r\n\r\n const api = useMemo(() => {\r\n return {\r\n ...state,\r\n\r\n login: async (options = {}) => {\n if (\r\n !mergedConfig.authority ||\r\n !mergedConfig.clientId ||\r\n !mergedConfig.redirectUri\r\n ) {\r\n throw new Error(\r\n \"Missing authority/clientId/redirectUri in IdpAuthProvider config.\",\r\n );\r\n }\r\n\r\n const verifier = generateCodeVerifier();\n const challenge = await generateCodeChallenge(verifier);\n const stateVal = randomState();\n const authorizeTenantKey = resolveAuthTenantKey(mergedConfig, options);\n const apiTenantKey = resolveApiTenantKey(mergedConfig, options);\n\n sessionStorage.setItem(mergedConfig.pkceVerifierKey, verifier);\n sessionStorage.setItem(mergedConfig.oauthStateKey, stateVal);\n if (apiTenantKey) {\n sessionStorage.setItem(mergedConfig.tenantKeyStorageKey, apiTenantKey);\n } else {\n sessionStorage.removeItem(mergedConfig.tenantKeyStorageKey);\n }\n\n const authorizeUrl = buildAuthorizeUrl(mergedConfig, {\n codeChallenge: challenge,\n state: stateVal,\n prompt: options.prompt,\n loginHint: options.loginHint,\n audience: options.audience,\n tenantKey: authorizeTenantKey,\n });\n\r\n window.location.assign(authorizeUrl);\r\n },\r\n\r\n logout: async () => {\r\n const logoutUrl = buildLogoutUrl(mergedConfig);\r\n clearRefreshTimer();\r\n\r\n try {\r\n await revokeToken(mergedConfig, {\r\n accessToken: state.accessToken,\r\n token: state.refreshToken,\r\n reasonRevoked: \"logout\",\r\n });\r\n } catch (error) {\r\n console.warn(\"Token revocation during logout failed.\", error);\r\n }\r\n\r\n if (typeof window !== \"undefined\" && logoutUrl) {\r\n window.addEventListener(\"pagehide\", clearLocalSession, { once: true });\r\n window.location.assign(logoutUrl);\r\n return;\r\n }\r\n\r\n clearLocalSession();\r\n },\r\n\r\n // exchanges code->tokens and stores the OAuth session\n handleCallback: async ({ code, state: returnedState }) => {\n const verifier = sessionStorage.getItem(mergedConfig.pkceVerifierKey);\n if (!verifier) throw new Error(\"Missing code verifier (PKCE).\");\n const tenantKey = resolveApiTenantKey(mergedConfig);\n\r\n const expectedState = sessionStorage.getItem(\r\n mergedConfig.oauthStateKey,\r\n );\r\n if (expectedState && returnedState && expectedState !== returnedState) {\r\n throw new Error(\"Invalid OAuth state. Possible CSRF.\");\r\n }\r\n var tokenPayload = {};\r\n try {\r\n tokenPayload = await exchangeAuthorizationCode(mergedConfig, {\r\n grantType: \"authorization_code\",\r\n clientId: mergedConfig.clientId,\r\n redirectUri: mergedConfig.redirectUri,\r\n code,\r\n codeVerifier: verifier,\r\n scope: mergedConfig.scope,\r\n });\r\n } catch (e) {\r\n console.error(\"exchangeAuthorizationCode failed:\", e);\r\n console.error(\"Status:\", e?.status);\r\n console.error(\"Data:\", e?.data);\r\n throw e;\r\n }\r\n\r\n const { accessToken, refreshToken, expiresIn, idToken } =\r\n extractToken(tokenPayload);\r\n\r\n if (!accessToken)\r\n throw new Error(\"Token response did not include an access token.\");\r\n\r\n const expiresAt = expiresIn ? Date.now() + expiresIn * 1000 : 0;\r\n\r\n dispatch({\n type: \"LOGIN_SUCCESS\",\n payload: {\n tenantKey,\n accessToken,\n refreshToken: refreshToken || \"\",\n idToken: idToken || \"\",\n expiresAt,\r\n landingPage: mergedConfig.postLoginRedirectUri || \"/\",\r\n },\r\n });\r\n\r\n // cleanup PKCE state\r\n sessionStorage.removeItem(mergedConfig.pkceVerifierKey);\r\n sessionStorage.removeItem(mergedConfig.oauthStateKey);\r\n\n return {\n tenantKey,\n accessToken,\n refreshToken: refreshToken || \"\",\n idToken: idToken || \"\",\n expiresAt,\r\n };\r\n },\r\n\r\n refresh: async () => {\r\n if (!state.refreshToken) throw new Error(\"No refresh token available.\");\r\n\r\n const tokenPayload = await refreshWithToken(mergedConfig, {\r\n grantType: \"refresh_token\",\r\n clientId: mergedConfig.clientId,\r\n refreshToken: state.refreshToken,\r\n scope: mergedConfig.scope,\r\n });\r\n\r\n const { accessToken, refreshToken, expiresIn, idToken } =\r\n extractToken(tokenPayload);\r\n if (!accessToken)\r\n throw new Error(\"Refresh response did not include an access token.\");\r\n\r\n const expiresAt = expiresIn ? Date.now() + expiresIn * 1000 : 0;\r\n\r\n dispatch({\r\n type: \"TOKENS_UPDATED\",\r\n payload: {\r\n accessToken,\r\n // if rotation: use new refresh token if provided\r\n refreshToken: refreshToken || state.refreshToken,\r\n idToken: idToken || state.idToken,\r\n expiresAt,\r\n },\r\n });\r\n\r\n return {\r\n accessToken,\r\n refreshToken: refreshToken || state.refreshToken,\r\n idToken,\r\n expiresAt,\r\n };\r\n },\r\n\r\n setError: (message) => dispatch({ type: \"SET_ERROR\", payload: message }),\r\n };\r\n }, [state, mergedConfig, storage]);\r\n\r\n return <AuthContext.Provider value={api}>{children}</AuthContext.Provider>;\r\n}\r\n\r\nexport function useAuth() {\r\n const ctx = useContext(AuthContext);\r\n if (!ctx) throw new Error(\"useAuth must be used inside IdpAuthProvider\");\r\n return ctx;\r\n}\r\n\r\nfunction safeJsonParse(raw) {\n try {\n return JSON.parse(raw);\n } catch {\n return null;\n }\n}\n\nfunction buildInitialState(persistedState, config) {\n if (!persistedState) {\n return {\n ...initialState,\n tenantKey: config.tenantKey,\n };\n }\n\n return {\n ...initialState,\n isAuthenticated: !!persistedState.isAuthenticated,\n landingPage: persistedState.landingPage || \"\",\n accessToken: persistedState.accessToken || \"\",\n refreshToken: persistedState.refreshToken || \"\",\n idToken: persistedState.idToken || \"\",\n expiresAt: persistedState.expiresAt || 0,\n error: persistedState.error || \"\",\n tenantKey: config.tenantKey,\n };\n}\n","export const defaultAuthConfig = {\n authority: \"\", // e.g. https://idp.tokentresor.com\n clientId: \"\",\n tenantKey: \"\",\n tenantPropagationMode: \"all\", // all | api | none\n tenantQueryParameter: \"tenant\",\n tenantHeaderName: \"X-Tenant-Key\",\n tenantKeyStorageKey: \"idp_tenant_key\",\n redirectUri: \"\", // e.g. https://app.com/auth/callback\n postLoginRedirectUri: \"/\", // where to go after success\n postLogoutRedirectUri: \"/login\", // where to go after logout\r\n scope: \"openid profile offline_access\",\r\n audience: \"\", // optional\r\n // endpoints (default paths)\r\n authorizePath: \"/authorize\",\r\n tokenPath: \"/token\",\n revokePath: \"/revoke\",\n logoutPath: \"/logout\",\n\n // storage: \"memory\" | \"sessionStorage\" | \"localStorage\"\n storage: \"sessionStorage\",\r\n\r\n // keys\r\n storageKey: \"idp_user\",\r\n pkceVerifierKey: \"idp_pkce_verifier\",\r\n oauthStateKey: \"idp_oauth_state\",\r\n\r\n // refresh behavior\r\n autoRefresh: true,\r\n // refresh skew in seconds (refresh token slightly before expiry)\r\n refreshSkewSeconds: 180,\r\n};\r\n","export function createStorage(mode) {\r\n if (mode === \"localStorage\") return window.localStorage;\r\n if (mode === \"sessionStorage\") return window.sessionStorage;\r\n\r\n // memory storage fallback\r\n let mem = {};\r\n return {\r\n getItem: (k) => (k in mem ? mem[k] : null),\r\n setItem: (k, v) => {\r\n mem[k] = String(v);\r\n },\r\n removeItem: (k) => {\r\n delete mem[k];\r\n },\r\n clear: () => {\r\n mem = {};\r\n },\r\n };\r\n}","function base64UrlEncode(arrayBuffer) {\r\n const bytes = new Uint8Array(arrayBuffer);\r\n let str = \"\";\r\n for (let i = 0; i < bytes.byteLength; i++)\r\n str += String.fromCharCode(bytes[i]);\r\n return btoa(str).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");\r\n}\r\n\r\nexport function generateCodeVerifier(length = 64) {\r\n const charset =\r\n \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~\";\r\n const randomValues = new Uint8Array(length);\r\n crypto.getRandomValues(randomValues);\r\n let verifier = \"\";\r\n for (let i = 0; i < randomValues.length; i++) {\r\n verifier += charset[randomValues[i] % charset.length];\r\n }\r\n return verifier;\r\n}\r\n\r\nexport async function generateCodeChallenge(verifier) {\r\n const enc = new TextEncoder();\r\n const data = enc.encode(verifier);\r\n const digest = await crypto.subtle.digest(\"SHA-256\", data);\r\n return base64UrlEncode(digest);\r\n}","export function normalizeTenantPropagationMode(value) {\n const normalized = String(value || \"all\").trim().toLowerCase();\n\n if (normalized === \"none\" || normalized === \"api\") {\n return normalized;\n }\n\n return \"all\";\n}\n\nexport function getAuthTenantKey(config) {\n return normalizeTenantPropagationMode(config?.tenantPropagationMode) === \"all\"\n ? String(config?.tenantKey || \"\").trim()\n : \"\";\n}\n\nexport function getApiTenantKey(config) {\n const mode = normalizeTenantPropagationMode(config?.tenantPropagationMode);\n\n return mode === \"all\" || mode === \"api\"\n ? String(config?.tenantKey || \"\").trim()\n : \"\";\n}\n\nexport function resolveRawTenantKey(config, overrides = {}) {\n const explicitTenantKey = String(\n overrides?.tenantKey || config?.tenantKey || \"\",\n ).trim();\n if (explicitTenantKey) {\n return explicitTenantKey;\n }\n\n if (typeof window !== \"undefined\") {\n const tenantFromQuery = new URLSearchParams(window.location.search).get(\n config?.tenantQueryParameter || \"tenant\",\n );\n if (tenantFromQuery) {\n return tenantFromQuery.trim();\n }\n }\n\n if (typeof sessionStorage !== \"undefined\") {\n const tenantFromStorage = sessionStorage.getItem(\n config?.tenantKeyStorageKey || \"idp_tenant_key\",\n );\n if (tenantFromStorage) {\n return tenantFromStorage.trim();\n }\n }\n\n return \"\";\n}\n\nexport function resolveAuthTenantKey(config, overrides = {}) {\n return normalizeTenantPropagationMode(config?.tenantPropagationMode) === \"all\"\n ? resolveRawTenantKey(config, overrides)\n : \"\";\n}\n\nexport function resolveApiTenantKey(config, overrides = {}) {\n const mode = normalizeTenantPropagationMode(config?.tenantPropagationMode);\n\n return mode === \"all\" || mode === \"api\"\n ? resolveRawTenantKey(config, overrides)\n : \"\";\n}\n","import {\n getAuthTenantKey,\n normalizeTenantPropagationMode,\n} from \"./tenant\";\n\nexport function randomState(length = 32) {\n const bytes = new Uint8Array(length);\n crypto.getRandomValues(bytes);\n return Array.from(bytes)\r\n .map((b) => b.toString(16).padStart(2, \"0\"))\r\n .join(\"\");\r\n}\r\n\r\nexport function buildAuthorizeUrl(config, params) {\n const url = new URL(config.authority + config.authorizePath);\n const tenantKey = getAuthTenantKey({\n ...config,\n tenantPropagationMode: normalizeTenantPropagationMode(\n config?.tenantPropagationMode,\n ),\n tenantKey: params.tenantKey || config.tenantKey,\n });\n\n url.searchParams.set(\"response_type\", \"code\");\n url.searchParams.set(\"client_id\", config.clientId);\n url.searchParams.set(\"redirect_uri\", config.redirectUri);\r\n url.searchParams.set(\"scope\", config.scope);\r\n\r\n url.searchParams.set(\"code_challenge\", params.codeChallenge);\r\n url.searchParams.set(\"code_challenge_method\", \"S256\");\r\n\r\n if (params.state) url.searchParams.set(\"state\", params.state);\n if (params.audience || config.audience)\n url.searchParams.set(\"audience\", params.audience || config.audience);\n if (tenantKey) {\n url.searchParams.set(\n config.tenantQueryParameter || \"tenant\",\n tenantKey,\n );\n }\n\n // optional extras\n if (params.prompt) url.searchParams.set(\"prompt\", params.prompt);\r\n if (params.loginHint) url.searchParams.set(\"login_hint\", params.loginHint);\r\n\r\n return url.toString();\r\n}\n","import { getApiTenantKey, getAuthTenantKey } from \"./tenant\";\n\nasync function httpPostJson(url, body, extraHeaders = {}) {\n const res = await fetch(url, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\", ...extraHeaders },\r\n body: JSON.stringify(body),\r\n });\r\n\r\n const text = await res.text();\r\n let data = null;\r\n try {\r\n data = text ? JSON.parse(text) : null;\r\n } catch {\r\n data = text;\r\n }\r\n\r\n if (!res.ok) {\r\n const msg = getErrorMessage(data, res.status);\r\n const err = new Error(msg);\r\n err.status = res.status;\r\n err.data = data;\r\n throw err;\r\n }\r\n\r\n return data;\r\n}\r\n\r\nfunction getErrorMessage(data, status) {\n if (!data) return `HTTP ${status}`;\r\n\r\n const wrappedError =\r\n data.error && typeof data.error === \"object\"\r\n ? data.error\r\n : data.value?.error && typeof data.value.error === \"object\"\r\n ? data.value.error\r\n : null;\r\n\r\n return (\r\n data.error_description ||\r\n wrappedError?.error ||\r\n wrappedError?.Error ||\r\n wrappedError?.message ||\r\n wrappedError?.Message ||\r\n (typeof data.error === \"string\" ? data.error : \"\") ||\r\n data.message ||\r\n `HTTP ${status}`\r\n );\r\n}\n\nfunction withTenant(url, config, target = \"api\") {\n const tenantKey = target === \"auth\"\n ? getAuthTenantKey(config)\n : getApiTenantKey(config);\n if (!tenantKey) {\n return url;\n }\n\n const tenantUrl = new URL(url, typeof window !== \"undefined\" ? window.location.origin : undefined);\n tenantUrl.searchParams.set(config.tenantQueryParameter || \"tenant\", tenantKey);\n return tenantUrl.toString();\n}\n\nexport function extractToken(tokenPayload) {\n if (!tokenPayload)\r\n return { accessToken: \"\", refreshToken: \"\", expiresIn: 0, idToken: \"\" };\r\n\r\n const accessToken =\r\n tokenPayload.value.accessToken || tokenPayload.value.access_token || \"\";\r\n const refreshToken =\r\n tokenPayload.value.refreshToken || tokenPayload.value.refresh_token || \"\";\r\n const expiresIn =\r\n Number(\r\n tokenPayload.value.expiresIn || tokenPayload.value.expires_in || 0,\r\n ) || 0;\r\n const idToken = tokenPayload.idToken || tokenPayload.id_token || \"\";\r\n\r\n return { accessToken, refreshToken, expiresIn, idToken };\r\n}\r\n\r\nexport async function exchangeAuthorizationCode(config, payload) {\n const url = withTenant(config.authority + config.tokenPath, config, \"auth\");\n return await httpPostJson(url, payload);\n}\n\nexport async function refreshWithToken(config, payload) {\n const url = withTenant(config.authority + config.tokenPath, config, \"auth\");\n return await httpPostJson(url, payload);\n}\n\r\nexport async function revokeToken(config, { accessToken, token, reasonRevoked }) {\r\n if (!config?.authority || !accessToken || !token) {\r\n return null;\r\n }\r\n\r\n const url = withTenant(\n new URL(config.revokePath || \"/revoke\", config.authority).toString(),\n config,\n \"auth\",\n );\n\n const res = await fetch(url, {\n method: \"DELETE\",\n headers: {\n Authorization: `Bearer ${accessToken}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n token,\n reasonRevoked: reasonRevoked || \"logout\",\n }),\r\n });\r\n\r\n const text = await res.text();\r\n let data = null;\r\n try {\r\n data = text ? JSON.parse(text) : null;\r\n } catch {\r\n data = text;\r\n }\r\n\r\n if (!res.ok) {\r\n const msg = getErrorMessage(data, res.status);\r\n const err = new Error(msg);\r\n err.status = res.status;\r\n err.data = data;\r\n throw err;\r\n }\r\n\r\n return data;\r\n}\r\n\r\nexport function buildLogoutUrl(config) {\n if (!config?.authority) return \"\";\n\n const url = new URL(\n withTenant(\n new URL(config.logoutPath || \"/logout\", config.authority).toString(),\n config,\n \"auth\",\n ),\n );\n if (config.clientId) {\n url.searchParams.set(\"client_id\", config.clientId);\n }\n\r\n const postLogoutRedirectUri = resolvePostLogoutRedirectUri(config);\r\n if (postLogoutRedirectUri) {\r\n url.searchParams.set(\"post_logout_redirect_uri\", postLogoutRedirectUri);\r\n }\r\n\r\n return url.toString();\r\n}\r\n\r\nfunction resolvePostLogoutRedirectUri(config) {\r\n const candidate = config?.postLogoutRedirectUri;\r\n if (!candidate) {\r\n return \"\";\r\n }\r\n\r\n if (typeof window !== \"undefined\" && window.location?.origin) {\r\n return new URL(candidate, window.location.origin).toString();\r\n }\r\n\r\n if (config?.redirectUri) {\r\n return new URL(candidate, config.redirectUri).toString();\r\n }\r\n\r\n return String(candidate);\r\n}\n","import React, { useEffect, useRef, useState } from \"react\";\r\nimport { useAuth } from \"./AuthProvider\";\r\nimport { useNavigate } from \"react-router-dom\";\r\nimport \"./styles/idp-default.css\";\r\n\r\nfunction renderLogoContent(logo, logoAlt, fallback) {\r\n if (!logo) {\r\n return <div className=\"logo mb-3\">{fallback}</div>;\r\n }\r\n\r\n if (typeof logo === \"string\") {\r\n return (\r\n <div className=\"mb-3\">\r\n <img src={logo} alt={logoAlt} width=\"250\" />\r\n </div>\r\n );\r\n }\r\n\r\n return <div className=\"mb-3\">{logo}</div>;\r\n}\r\n\r\nexport function AuthCallback({\r\n redirectTo,\r\n logo = null,\r\n logoAlt = \"Application logo\",\r\n fallbackBadge = \"ID\",\r\n}) {\r\n const navigate = useNavigate();\r\n const auth = useAuth();\r\n const [error, setError] = useState(null);\r\n const ranRef = useRef(false);\r\n\r\n useEffect(() => {\r\n const run = async () => {\r\n if (ranRef.current) return;\r\n ranRef.current = true;\r\n\r\n const qs = new URLSearchParams(window.location.search);\r\n const code = qs.get(\"code\");\r\n const state = qs.get(\"state\");\r\n const err = qs.get(\"error\");\r\n const errDesc = qs.get(\"error_description\");\r\n\r\n if (err) {\r\n const msg = errDesc || err || \"Authentication error.\";\r\n setError(msg);\r\n auth.setError(msg);\r\n return;\r\n }\r\n\r\n if (!code || !state) {\r\n const msg = \"Missing authorization code or state.\";\r\n setError(msg);\r\n auth.setError(msg);\r\n return;\r\n }\r\n\r\n try {\r\n await auth.handleCallback({ code, state });\r\n const target = redirectTo || auth.landingPage || \"/\";\r\n navigate(target, { replace: true });\r\n } catch (e) {\r\n const msg = e?.message || \"Login callback failed.\";\r\n setError(msg);\r\n auth.setError(msg);\r\n }\r\n };\r\n\r\n run();\r\n }, [auth, navigate, redirectTo]);\r\n\r\n return (\r\n <div className=\"login-page\">\r\n <section className=\"login-section-container\">\r\n <div className=\"login-section redirect-card\">\r\n <div className=\"col-12 p-4 text-center\">\r\n {renderLogoContent(logo, logoAlt, fallbackBadge)}\r\n <h1>Completing sign-in</h1>\r\n <p className=\"text-muted\">\r\n {error ? error : \"Please wait while we finish authentication.\"}\r\n </p>\r\n </div>\r\n </div>\r\n </section>\r\n </div>\r\n );\r\n}\r\n","import React, { useEffect } from \"react\";\r\nimport { useAuth } from \"./AuthProvider\";\r\nimport \"./styles/idp-default.css\";\r\n\r\nfunction renderLogoContent(logo, logoAlt, fallback) {\r\n if (!logo) {\r\n return <div className=\"logo mb-3\">{fallback}</div>;\r\n }\r\n\r\n if (typeof logo === \"string\") {\r\n return (\r\n <div className=\"mb-3\">\r\n <img src={logo} alt={logoAlt} width=\"250\" />\r\n </div>\r\n );\r\n }\r\n\r\n return <div className=\"mb-3\">{logo}</div>;\r\n}\r\n\r\nexport function LoginPage({\r\n logo = null,\r\n logoAlt = \"Application logo\",\r\n title = \"Redirecting to sign-in...\",\r\n subtitle = \"Please wait while we securely connect to Identity.\",\r\n signedOutBadge = \"Signed out\",\r\n signedOutTitle = \"You have been signed out\",\r\n signedOutSubtitle = \"Start a new session when you are ready.\",\r\n signInAgainLabel = \"Sign in again\",\r\n fallbackBadge = \"ID\",\r\n loginOptions,\r\n}) {\r\n const auth = useAuth();\r\n const isLoggedOut =\r\n new URLSearchParams(window.location.search).get(\"logged_out\") === \"1\";\r\n\r\n useEffect(() => {\r\n if (isLoggedOut) {\r\n return;\r\n }\r\n\r\n auth.login(loginOptions);\r\n }, [auth, isLoggedOut, loginOptions]);\r\n\r\n if (isLoggedOut) {\r\n return (\r\n <div className=\"login-page\">\r\n <section className=\"login-section-container\">\r\n <div className=\"login-section redirect-card\">\r\n <div className=\"p-4 text-center\">\r\n {renderLogoContent(logo, logoAlt, fallbackBadge)}\r\n <h1>{signedOutTitle}</h1>\r\n <p className=\"text-muted\">{signedOutSubtitle}</p>\r\n <button\r\n className=\"btn btn-primary mt-3\"\r\n onClick={() => auth.login(loginOptions)}\r\n >\r\n {signInAgainLabel}\r\n </button>\r\n </div>\r\n </div>\r\n </section>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"login-page\">\r\n <section className=\"login-section-container\">\r\n <div className=\"login-section redirect-card\">\r\n <div className=\"p-4 text-center\">\r\n {renderLogoContent(logo, logoAlt, fallbackBadge)}\r\n <h1>{title}</h1>\r\n <p className=\"text-muted\">{subtitle}</p>\r\n <div className=\"spinner mt-3\"></div>\r\n </div>\r\n </div>\r\n </section>\r\n </div>\r\n );\r\n}\r\n"],"mappings":"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","names":["React","useEffect","useRef","React","useRef","useEffect","React","useEffect","renderLogoContent","React","useEffect"]}
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "tokenidp-react",
3
+ "version": "0.3.5",
4
+ "main": "dist/index.js",
5
+ "module": "dist/index.mjs",
6
+ "files": [
7
+ "dist"
8
+ ],
9
+ "sideEffects": false,
10
+ "peerDependencies": {
11
+ "react": "^18.0.0",
12
+ "react-dom": "^18.0.0",
13
+ "react-router-dom": "^6.0.0"
14
+ },
15
+ "devDependencies": {
16
+ "react": "^18.2.0",
17
+ "react-dom": "^18.2.0",
18
+ "react-router-dom": "^6.22.0",
19
+ "tsup": "^8.0.0",
20
+ "typescript": "^5.8.3"
21
+ },
22
+ "scripts": {
23
+ "build": "tsup",
24
+ "pack": "npm run build && npm pack"
25
+ },
26
+ "keywords": [
27
+ "react",
28
+ "oauth2",
29
+ "openid-connect",
30
+ "pkce",
31
+ "tokenidp"
32
+ ],
33
+ "author": "",
34
+ "license": "MIT",
35
+ "description": "React SDK for integrating TokenIDP OAuth 2.1 and OpenID Connect authentication.",
36
+ "repository": {
37
+ "type": "git",
38
+ "url": "git+https://github.com/naeemraza-dev/tokenidp.git",
39
+ "directory": "sdks/react-idp-sdk"
40
+ },
41
+ "homepage": "https://github.com/naeemraza-dev/tokenidp#readme",
42
+ "bugs": {
43
+ "url": "https://github.com/naeemraza-dev/tokenidp/issues"
44
+ },
45
+ "publishConfig": {
46
+ "access": "public"
47
+ },
48
+ "exports": {
49
+ ".": {
50
+ "import": "./dist/index.mjs",
51
+ "require": "./dist/index.js"
52
+ }
53
+ }
54
+ }