@nuria-tech/auth-sdk 1.0.2 → 1.0.4
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.
- package/README.md +207 -188
- package/dist/angular.cjs +49 -0
- package/dist/angular.cjs.map +1 -0
- package/dist/angular.d.cts +22 -0
- package/dist/angular.d.ts +22 -0
- package/dist/angular.js +47 -0
- package/dist/angular.js.map +1 -0
- package/dist/cookie-storage-adapter-EJeGX8Tl.d.ts +16 -0
- package/dist/cookie-storage-adapter-FKYkZ--Y.d.cts +16 -0
- package/dist/index.cjs +195 -24
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -84
- package/dist/index.d.ts +4 -84
- package/dist/index.js +195 -24
- package/dist/index.js.map +1 -1
- package/dist/next.cjs +719 -0
- package/dist/next.cjs.map +1 -0
- package/dist/next.d.cts +12 -0
- package/dist/next.d.ts +12 -0
- package/dist/next.js +716 -0
- package/dist/next.js.map +1 -0
- package/dist/nuxt.cjs +719 -0
- package/dist/nuxt.cjs.map +1 -0
- package/dist/nuxt.d.cts +12 -0
- package/dist/nuxt.d.ts +12 -0
- package/dist/nuxt.js +716 -0
- package/dist/nuxt.js.map +1 -0
- package/dist/react.cjs +89 -0
- package/dist/react.cjs.map +1 -0
- package/dist/react.d.cts +27 -0
- package/dist/react.d.ts +27 -0
- package/dist/react.js +85 -0
- package/dist/react.js.map +1 -0
- package/dist/types-2k4ZYpF4.d.cts +103 -0
- package/dist/types-2k4ZYpF4.d.ts +103 -0
- package/dist/vue.cjs +57 -0
- package/dist/vue.cjs.map +1 -0
- package/dist/vue.d.cts +13 -0
- package/dist/vue.d.ts +13 -0
- package/dist/vue.js +55 -0
- package/dist/vue.js.map +1 -0
- package/package.json +51 -2
package/dist/nuxt.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/errors/auth-error.ts","../src/core/pkce.ts","../src/core/utils.ts","../src/storage/memory-storage-adapter.ts","../src/transport/fetch-transport.ts","../src/client/nuria-auth-client.ts","../src/client/create-client.ts","../src/storage/cookie-storage-adapter.ts","../src/nuxt/index.ts"],"names":[],"mappings":"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","file":"nuxt.js","sourcesContent":["export enum AuthErrorCode {\n INVALID_CONFIG = 'INVALID_CONFIG',\n STATE_MISMATCH = 'STATE_MISMATCH',\n CALLBACK_ERROR = 'CALLBACK_ERROR',\n TOKEN_EXCHANGE_FAILED = 'TOKEN_EXCHANGE_FAILED',\n REFRESH_FAILED = 'REFRESH_FAILED',\n STORAGE_ERROR = 'STORAGE_ERROR',\n MISSING_CODE = 'MISSING_CODE',\n MISSING_STATE = 'MISSING_STATE',\n NETWORK_ERROR = 'NETWORK_ERROR',\n HTTP_ERROR = 'HTTP_ERROR',\n}\n\nexport class AuthError extends Error {\n constructor(\n public readonly code: AuthErrorCode,\n message: string,\n public readonly cause?: unknown,\n ) {\n super(message);\n this.name = 'AuthError';\n }\n}\n","const ALPHABET =\n 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~';\n\nfunction getCryptoImpl(): Crypto {\n if (typeof globalThis !== 'undefined' && globalThis.crypto) {\n return globalThis.crypto;\n }\n throw new Error('Web Crypto API unavailable');\n}\n\nexport function randomString(length = 64): string {\n const crypto = getCryptoImpl();\n // Rejection sampling: discard bytes >= threshold to eliminate modulo bias.\n // ALPHABET.length = 66; threshold = 256 - (256 % 66) = 204\n const THRESHOLD = 256 - (256 % ALPHABET.length);\n const result: string[] = [];\n while (result.length < length) {\n const bytes = new Uint8Array(Math.ceil((length - result.length) * 1.4));\n crypto.getRandomValues(bytes);\n for (const b of bytes) {\n if (result.length >= length) break;\n if (b < THRESHOLD) result.push(ALPHABET[b % ALPHABET.length]!);\n }\n }\n return result.join('');\n}\n\nfunction toBase64Url(bytes: Uint8Array<ArrayBuffer>): string {\n const binary = Array.from(bytes, (b) => String.fromCharCode(b)).join('');\n return btoa(binary).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n}\n\nfunction verifierToBytes(verifier: string): Uint8Array<ArrayBuffer> {\n const bytes = new Uint8Array(verifier.length);\n for (let i = 0; i < verifier.length; i++) {\n bytes[i] = verifier.charCodeAt(i);\n }\n return bytes;\n}\n\nexport async function createCodeChallenge(verifier: string): Promise<string> {\n const crypto = getCryptoImpl();\n const buffer = verifierToBytes(verifier);\n const digest = await crypto.subtle.digest('SHA-256', buffer);\n return toBase64Url(new Uint8Array(digest));\n}\n","import { AuthError, AuthErrorCode } from '../errors/auth-error';\nimport type { StorageAdapter, TokenSet } from './types';\n\nexport const STORAGE_KEYS = {\n session: 'nuria:session',\n state: 'nuria:oauth:state',\n codeVerifier: 'nuria:oauth:code_verifier',\n};\n\nexport function normalizeTokenSet(\n raw: Record<string, unknown>,\n now: () => number,\n): TokenSet {\n const accessToken = (raw.access_token ??\n raw.accessToken ??\n raw.Token) as string;\n if (!accessToken || typeof accessToken !== 'string') {\n throw new AuthError(\n AuthErrorCode.TOKEN_EXCHANGE_FAILED,\n 'Missing access token in token response',\n );\n }\n const expiresIn = Number(raw.expires_in ?? raw.expiresIn ?? 0) || undefined;\n const expiresAtFromResponse = Number(raw.ExpiresAt ?? 0) || undefined;\n const computedExpiresAt =\n expiresIn != null\n ? now() + expiresIn * 1000\n : expiresAtFromResponse\n ? expiresAtFromResponse\n : undefined;\n return {\n accessToken,\n tokenType: (raw.token_type ?? raw.tokenType ?? raw.TokenType) as\n | string\n | undefined,\n expiresIn,\n refreshToken: (raw.refresh_token ??\n raw.refreshToken ??\n raw.RefreshToken) as string | undefined,\n idToken: (raw.id_token ?? raw.idToken) as string | undefined,\n scope: raw.scope as string | undefined,\n expiresAt: computedExpiresAt,\n };\n}\n\nexport async function safeGet(\n storage: StorageAdapter,\n key: string,\n): Promise<string | null> {\n try {\n return await storage.get(key);\n } catch (cause) {\n throw new AuthError(\n AuthErrorCode.STORAGE_ERROR,\n `Failed reading key: ${key}`,\n cause,\n );\n }\n}\n\nexport async function safeSet(\n storage: StorageAdapter,\n key: string,\n value: string,\n): Promise<void> {\n try {\n await storage.set(key, value);\n } catch (cause) {\n throw new AuthError(\n AuthErrorCode.STORAGE_ERROR,\n `Failed writing key: ${key}`,\n cause,\n );\n }\n}\n\nexport async function safeRemove(\n storage: StorageAdapter,\n key: string,\n): Promise<void> {\n try {\n await storage.remove(key);\n } catch (cause) {\n throw new AuthError(\n AuthErrorCode.STORAGE_ERROR,\n `Failed removing key: ${key}`,\n cause,\n );\n }\n}\n\nexport function timingSafeEqual(a: string, b: string): boolean {\n if (a.length !== b.length) return false;\n let diff = 0;\n for (let i = 0; i < a.length; i++) {\n diff |= a.charCodeAt(i) ^ b.charCodeAt(i);\n }\n return diff === 0;\n}\n\nexport function parseUrl(url: string): URL {\n try {\n return new URL(url);\n } catch {\n throw new AuthError(AuthErrorCode.CALLBACK_ERROR, 'Invalid callback URL');\n }\n}\n","import type { StorageAdapter } from '../core/types';\n\nexport class MemoryStorageAdapter implements StorageAdapter {\n private store = new Map<string, string>();\n\n get(key: string): string | null {\n return this.store.get(key) ?? null;\n }\n\n set(key: string, value: string): void {\n this.store.set(key, value);\n }\n\n remove(key: string): void {\n this.store.delete(key);\n }\n}\n","import { AuthError, AuthErrorCode } from '../errors/auth-error';\nimport type {\n AuthTransport,\n AuthTransportRequest,\n AuthTransportResponse,\n TransportInterceptor,\n} from '../core/types';\n\nexport interface FetchTransportOptions {\n fetchFn?: typeof fetch;\n timeoutMs?: number;\n retries?: number;\n interceptors?: TransportInterceptor[];\n}\n\nconst RETRYABLE_STATUS = new Set([408, 425, 429, 500, 502, 503, 504]);\n\nexport class FetchAuthTransport implements AuthTransport {\n private readonly fetchFn: typeof fetch;\n private readonly timeoutMs?: number;\n private readonly retries: number;\n private readonly interceptors: TransportInterceptor[];\n\n constructor(options: FetchTransportOptions = {}) {\n this.fetchFn = options.fetchFn ?? fetch;\n this.timeoutMs = options.timeoutMs;\n this.retries = options.retries ?? 0;\n this.interceptors = options.interceptors ?? [];\n }\n\n async request<T = unknown>(\n url: string,\n req: AuthTransportRequest = {},\n ): Promise<AuthTransportResponse<T>> {\n let request = req;\n for (const i of this.interceptors) {\n if (i.onRequest) request = await i.onRequest(url, request);\n }\n\n const retries = request.retries ?? this.retries;\n let attempt = 0;\n while (true) {\n const controller = new AbortController();\n const timeout = request.timeoutMs ?? this.timeoutMs;\n const timer = timeout\n ? setTimeout(() => controller.abort(), timeout)\n : undefined;\n try {\n const defaultContentType =\n typeof request.body === 'string'\n ? 'application/x-www-form-urlencoded'\n : 'application/json';\n const res = await this.fetchFn(this.withQuery(url, request.query), {\n method: request.method ?? 'GET',\n credentials: request.credentials,\n headers: {\n 'Content-Type': defaultContentType,\n ...(request.headers ?? {}),\n },\n body:\n request.body !== undefined\n ? typeof request.body === 'string'\n ? request.body\n : JSON.stringify(request.body)\n : undefined,\n signal: controller.signal,\n });\n const data = await this.parseBody<T>(res);\n if (!res.ok) {\n if (attempt < retries && RETRYABLE_STATUS.has(res.status)) {\n attempt += 1;\n continue;\n }\n throw new AuthError(AuthErrorCode.HTTP_ERROR, `HTTP ${res.status}`);\n }\n let out: AuthTransportResponse<T> = {\n status: res.status,\n data,\n headers: res.headers,\n };\n for (const i of this.interceptors) {\n if (i.onResponse) out = await i.onResponse(out);\n }\n return out;\n } catch (cause) {\n if (cause instanceof AuthError) throw cause;\n if (attempt < retries) {\n attempt += 1;\n continue;\n }\n throw new AuthError(\n AuthErrorCode.NETWORK_ERROR,\n 'Network request failed',\n cause,\n );\n } finally {\n if (timer) clearTimeout(timer);\n }\n }\n }\n\n private withQuery(\n url: string,\n query?: Record<string, string | undefined>,\n ): string {\n if (!query) return url;\n const parsed = new URL(url);\n Object.entries(query).forEach(([k, v]) => {\n if (v !== undefined) parsed.searchParams.set(k, v);\n });\n return parsed.toString();\n }\n\n private async parseBody<T>(res: Response): Promise<T> {\n const contentType = res.headers.get('content-type') ?? '';\n if (contentType.includes('application/json')) {\n return (await res.json()) as T;\n }\n return (await res.text()) as unknown as T;\n }\n}\n","import { AuthError, AuthErrorCode } from '../errors/auth-error';\nimport { createCodeChallenge, randomString } from '../core/pkce';\nimport {\n normalizeTokenSet,\n parseUrl,\n safeGet,\n safeRemove,\n safeSet,\n timingSafeEqual,\n STORAGE_KEYS,\n} from '../core/utils';\nimport type {\n AuthClient,\n ResolvedAuthConfig,\n Session,\n StartLoginOptions,\n LoginCodeChallengeOptions,\n GoogleLoginOptions,\n PasswordLoginOptions,\n VerifyLoginCodeOptions,\n TwoFactorChallenge,\n TokenSet,\n AuthTransport,\n} from '../core/types';\nimport { MemoryStorageAdapter } from '../storage/memory-storage-adapter';\nimport { FetchAuthTransport } from '../transport/fetch-transport';\n\nexport class DefaultAuthClient implements AuthClient {\n private session: Session | null = null;\n private refreshPromise: Promise<Session> | null = null;\n private readonly listeners = new Set<(session: Session | null) => void>();\n private readonly storage;\n private readonly transport: AuthTransport;\n private readonly now: () => number;\n\n constructor(private readonly config: ResolvedAuthConfig) {\n this.storage = config.storage ?? new MemoryStorageAdapter();\n this.transport = config.transport ?? new FetchAuthTransport();\n this.now = config.now ?? (() => Date.now());\n }\n\n async startLogin(options: StartLoginOptions = {}): Promise<void> {\n const state = randomString(32);\n const codeVerifier = randomString(96);\n const codeChallenge = await createCodeChallenge(codeVerifier);\n\n await safeSet(this.storage, STORAGE_KEYS.state, state);\n await safeSet(this.storage, STORAGE_KEYS.codeVerifier, codeVerifier);\n\n const params: Record<string, string> = {\n response_type: 'code',\n client_id: this.config.clientId,\n redirect_uri: this.config.redirectUri,\n state,\n code_challenge: codeChallenge,\n code_challenge_method: 'S256',\n };\n\n const scope = options.scopes?.join(' ') ?? this.config.scope;\n if (scope) params.scope = scope;\n if (options.loginHint) params.login_hint = options.loginHint;\n if (options.extraParams) {\n const RESERVED = new Set([\n 'response_type',\n 'client_id',\n 'redirect_uri',\n 'state',\n 'code_challenge',\n 'code_challenge_method',\n ]);\n for (const [k, v] of Object.entries(options.extraParams)) {\n if (!RESERVED.has(k)) params[k] = v;\n }\n }\n\n const url = new URL(this.config.authorizationEndpoint);\n Object.entries(params).forEach(([k, v]) => url.searchParams.set(k, v));\n const redirectUrl = url.toString();\n\n if (this.config.onRedirect) {\n await this.config.onRedirect(redirectUrl);\n return;\n }\n if (typeof window !== 'undefined') {\n window.location.assign(redirectUrl);\n return;\n }\n throw new AuthError(\n AuthErrorCode.INVALID_CONFIG,\n 'Missing onRedirect callback for non-browser runtime',\n );\n }\n\n async handleRedirectCallback(callbackUrl?: string): Promise<Session> {\n const input =\n callbackUrl ??\n (typeof window !== 'undefined' ? window.location.href : '');\n if (!input) {\n throw new AuthError(\n AuthErrorCode.CALLBACK_ERROR,\n 'callbackUrl required in non-browser runtime',\n );\n }\n\n const url = parseUrl(input);\n const error = url.searchParams.get('error');\n if (error) {\n const desc = url.searchParams.get('error_description');\n throw new AuthError(\n AuthErrorCode.CALLBACK_ERROR,\n desc\n ? `Authorization error: ${error} — ${desc}`\n : `Authorization error: ${error}`,\n );\n }\n\n const code = url.searchParams.get('code');\n if (!code) {\n throw new AuthError(\n AuthErrorCode.MISSING_CODE,\n 'Missing code in callback',\n );\n }\n\n const state = url.searchParams.get('state');\n if (!state) {\n throw new AuthError(\n AuthErrorCode.MISSING_STATE,\n 'Missing state in callback',\n );\n }\n\n const storedState = await safeGet(this.storage, STORAGE_KEYS.state);\n if (!storedState || !timingSafeEqual(storedState, state)) {\n throw new AuthError(\n AuthErrorCode.STATE_MISMATCH,\n 'State validation failed',\n );\n }\n\n return this.exchangeCode(code);\n }\n\n getSession(): Session | null {\n return this.session;\n }\n\n async getAccessToken(): Promise<string | null> {\n if (!this.session) {\n await this.hydrateSession();\n }\n if (!this.session) return null;\n const exp = this.session.tokens.expiresAt;\n if (exp && exp <= this.now() && this.config.enableRefreshToken) {\n if (!this.refreshPromise) {\n this.refreshPromise = this.doRefresh().finally(() => {\n this.refreshPromise = null;\n });\n }\n await this.refreshPromise;\n }\n return this.session?.tokens.accessToken ?? null;\n }\n\n async logout(options?: { returnTo?: string }): Promise<void> {\n if (options?.returnTo) {\n let returnToUrl: URL;\n try {\n returnToUrl = new URL(options.returnTo);\n } catch {\n throw new AuthError(\n AuthErrorCode.INVALID_CONFIG,\n 'returnTo must be a valid absolute URL',\n );\n }\n\n const isHttps = returnToUrl.protocol === 'https:';\n const isLocalHttp =\n returnToUrl.protocol === 'http:' &&\n (returnToUrl.hostname === 'localhost' ||\n returnToUrl.hostname === '127.0.0.1' ||\n returnToUrl.hostname === '[::1]');\n if (!isHttps && !isLocalHttp) {\n throw new AuthError(\n AuthErrorCode.INVALID_CONFIG,\n 'returnTo must use https:// (or http:// only for localhost)',\n );\n }\n if (returnToUrl.username || returnToUrl.password) {\n throw new AuthError(\n AuthErrorCode.INVALID_CONFIG,\n 'returnTo must not include URL credentials',\n );\n }\n }\n\n this.session = null;\n await safeRemove(this.storage, STORAGE_KEYS.session);\n await safeRemove(this.storage, STORAGE_KEYS.state);\n await safeRemove(this.storage, STORAGE_KEYS.codeVerifier);\n this.notify();\n\n if (this.config.logoutEndpoint) {\n const url = new URL(this.config.logoutEndpoint);\n if (options?.returnTo) {\n url.searchParams.set('returnTo', options.returnTo);\n }\n const logoutUrl = url.toString();\n if (this.config.onRedirect) {\n await this.config.onRedirect(logoutUrl);\n } else if (typeof window !== 'undefined') {\n window.location.assign(logoutUrl);\n }\n }\n }\n\n isAuthenticated(): boolean {\n const accessToken = this.session?.tokens.accessToken;\n if (!accessToken) return false;\n const exp = this.session?.tokens.expiresAt;\n if (exp && exp <= this.now()) return false;\n return true;\n }\n\n onAuthStateChanged(handler: (session: Session | null) => void): () => void {\n this.listeners.add(handler);\n return () => this.listeners.delete(handler);\n }\n\n async getUserinfo(): Promise<Record<string, unknown>> {\n const accessToken = await this.getAccessToken();\n if (!accessToken) {\n throw new AuthError(\n AuthErrorCode.INVALID_CONFIG,\n 'Not authenticated — call handleRedirectCallback first',\n );\n }\n if (!this.config.userinfoEndpoint) {\n throw new AuthError(\n AuthErrorCode.INVALID_CONFIG,\n 'config.userinfoEndpoint is required for getUserinfo',\n );\n }\n const response = await this.transport.request<Record<string, unknown>>(\n this.config.userinfoEndpoint,\n { headers: { Authorization: `Bearer ${accessToken}` } },\n );\n return response.data;\n }\n\n async startLoginCodeChallenge(\n options: LoginCodeChallengeOptions,\n ): Promise<TwoFactorChallenge> {\n if (!options?.email) {\n throw new AuthError(\n AuthErrorCode.INVALID_CONFIG,\n 'email is required for startLoginCodeChallenge',\n );\n }\n\n const response = await this.transport.request<Record<string, unknown>>(\n `${this.config.baseUrl}/v2/login-code/challenge`,\n {\n method: 'POST',\n credentials: 'include',\n body: {\n email: options.email,\n channel: options.channel ?? 'email',\n destination: options.destination,\n purpose: options.purpose ?? 'login',\n },\n },\n );\n\n return {\n challengeId: String(response.data.challengeId ?? ''),\n channel: String(response.data.channel ?? ''),\n destinationMasked: String(response.data.destinationMasked ?? ''),\n expiresAt: Number(response.data.expiresAt ?? 0),\n purpose: String(response.data.purpose ?? 'login'),\n };\n }\n\n async verifyLoginCode(options: VerifyLoginCodeOptions): Promise<Session> {\n if (!options?.challengeId || !options?.code) {\n throw new AuthError(\n AuthErrorCode.INVALID_CONFIG,\n 'challengeId and code are required for verifyLoginCode',\n );\n }\n\n const response = await this.transport.request<Record<string, unknown>>(\n `${this.config.baseUrl}/v2/2fa/verify-login`,\n {\n method: 'POST',\n credentials: 'include',\n body: {\n challengeId: options.challengeId,\n code: options.code,\n },\n },\n );\n const tokens = normalizeTokenSet(response.data, this.now);\n return this.createSession(tokens);\n }\n\n async loginWithCodeSent(\n options: LoginCodeChallengeOptions,\n ): Promise<TwoFactorChallenge> {\n return this.startLoginCodeChallenge(options);\n }\n\n async completeLoginWithCode(\n options: VerifyLoginCodeOptions,\n ): Promise<Session> {\n return this.verifyLoginCode(options);\n }\n\n async loginWithGoogle(options: GoogleLoginOptions): Promise<Session> {\n if (!options?.idToken) {\n throw new AuthError(\n AuthErrorCode.INVALID_CONFIG,\n 'idToken is required for loginWithGoogle',\n );\n }\n\n const response = await this.transport.request<Record<string, unknown>>(\n `${this.config.baseUrl}/v2/google`,\n {\n method: 'POST',\n credentials: 'include',\n body: {\n idToken: options.idToken,\n },\n },\n );\n const tokens = normalizeTokenSet(response.data, this.now);\n return this.createSession(tokens);\n }\n\n async loginWithPassword(options: PasswordLoginOptions): Promise<Session> {\n if (!options?.email || !options?.password) {\n throw new AuthError(\n AuthErrorCode.INVALID_CONFIG,\n 'email and password are required for loginWithPassword',\n );\n }\n\n const response = await this.transport.request<Record<string, unknown>>(\n `${this.config.baseUrl}/v2/login`,\n {\n method: 'POST',\n credentials: 'include',\n body: {\n email: options.email,\n password: options.password,\n },\n },\n );\n const tokens = normalizeTokenSet(response.data, this.now);\n return this.createSession(tokens);\n }\n\n private async exchangeCode(code: string): Promise<Session> {\n const verifier = await safeGet(this.storage, STORAGE_KEYS.codeVerifier);\n if (!verifier) {\n throw new AuthError(\n AuthErrorCode.TOKEN_EXCHANGE_FAILED,\n 'Missing PKCE code_verifier in storage',\n );\n }\n\n const body = new URLSearchParams({\n grant_type: 'authorization_code',\n code,\n code_verifier: verifier,\n redirect_uri: this.config.redirectUri,\n client_id: this.config.clientId,\n });\n\n const response = await this.transport.request<Record<string, unknown>>(\n this.config.tokenEndpoint,\n {\n method: 'POST',\n credentials: 'include',\n body: body.toString(),\n },\n );\n const tokens = normalizeTokenSet(response.data, this.now);\n await safeRemove(this.storage, STORAGE_KEYS.state);\n await safeRemove(this.storage, STORAGE_KEYS.codeVerifier);\n return this.createSession(tokens);\n }\n\n private async doRefresh(): Promise<Session> {\n const refreshToken = this.session?.tokens.refreshToken;\n const body = new URLSearchParams({\n grant_type: 'refresh_token',\n client_id: this.config.clientId,\n });\n if (refreshToken) body.set('refresh_token', refreshToken);\n\n const response = await this.transport.request<Record<string, unknown>>(\n this.config.tokenEndpoint,\n {\n method: 'POST',\n credentials: 'include',\n body: body.toString(),\n },\n );\n const tokens = normalizeTokenSet(response.data, this.now);\n return this.createSession(tokens);\n }\n\n private async createSession(tokens: TokenSet): Promise<Session> {\n const previousRefreshToken = this.session?.tokens.refreshToken;\n const mergedTokens: TokenSet = {\n ...tokens,\n refreshToken: tokens.refreshToken ?? previousRefreshToken,\n };\n\n this.session = {\n tokens: mergedTokens,\n createdAt: this.now(),\n };\n await safeSet(\n this.storage,\n STORAGE_KEYS.session,\n JSON.stringify(this.session),\n );\n this.notify();\n return this.session;\n }\n\n private notify(): void {\n this.listeners.forEach((handler) => handler(this.session));\n }\n\n private async hydrateSession(): Promise<void> {\n const raw = await safeGet(this.storage, STORAGE_KEYS.session);\n if (!raw) return;\n try {\n const parsed = JSON.parse(raw) as Session;\n if (typeof parsed?.tokens?.accessToken !== 'string') {\n await safeRemove(this.storage, STORAGE_KEYS.session);\n return;\n }\n this.session = parsed;\n } catch {\n await safeRemove(this.storage, STORAGE_KEYS.session);\n this.session = null;\n }\n }\n}\n","import { DefaultAuthClient } from './nuria-auth-client';\nimport { AuthError, AuthErrorCode } from '../errors/auth-error';\nimport type { AuthClient, AuthConfig, ResolvedAuthConfig } from '../core/types';\n\nconst DEFAULT_AUTH_BASE_URL = 'https://ms-auth-v2.nuria.com.br';\nconst DEFAULT_AUTHORIZATION_PATH = '/v2/oauth/authorize';\nconst DEFAULT_TOKEN_PATH = '/v2/oauth/token';\nconst DEFAULT_SCOPE = 'openid profile email';\n\nfunction normalizeBaseUrl(value?: string): string {\n const raw = String(value ?? DEFAULT_AUTH_BASE_URL).trim();\n if (!raw) {\n throw new AuthError(\n AuthErrorCode.INVALID_CONFIG,\n 'config.baseUrl must be a valid absolute URL',\n );\n }\n\n let parsed: URL;\n try {\n parsed = new URL(raw);\n } catch {\n throw new AuthError(\n AuthErrorCode.INVALID_CONFIG,\n 'config.baseUrl must be a valid absolute URL',\n );\n }\n\n return parsed.toString().replace(/\\/+$/, '');\n}\n\nfunction resolveEndpoint(\n baseUrl: string,\n explicit: string | undefined,\n fallbackPath: string,\n): string {\n if (explicit) {\n try {\n return new URL(explicit).toString();\n } catch {\n throw new AuthError(\n AuthErrorCode.INVALID_CONFIG,\n 'OAuth endpoints must be valid absolute URLs',\n );\n }\n }\n\n return new URL(fallbackPath, `${baseUrl}/`).toString();\n}\n\nexport function createAuthClient(config: AuthConfig): AuthClient {\n if (!config?.clientId) {\n throw new AuthError(\n AuthErrorCode.INVALID_CONFIG,\n 'config.clientId is required',\n );\n }\n if (!config.redirectUri) {\n throw new AuthError(\n AuthErrorCode.INVALID_CONFIG,\n 'config.redirectUri is required',\n );\n }\n\n const baseUrl = normalizeBaseUrl(config.baseUrl);\n const resolvedConfig: ResolvedAuthConfig = {\n ...config,\n baseUrl,\n scope: String(config.scope ?? '').trim() || DEFAULT_SCOPE,\n enableRefreshToken: config.enableRefreshToken ?? true,\n authorizationEndpoint: resolveEndpoint(\n baseUrl,\n config.authorizationEndpoint,\n DEFAULT_AUTHORIZATION_PATH,\n ),\n tokenEndpoint: resolveEndpoint(\n baseUrl,\n config.tokenEndpoint,\n DEFAULT_TOKEN_PATH,\n ),\n };\n\n return new DefaultAuthClient(resolvedConfig);\n}\n","import type { StorageAdapter } from '../core/types';\n\nexport interface CookieStorageCallbacks {\n getCookie(name: string): string | null | Promise<string | null>;\n setCookie(name: string, value: string): void | Promise<void>;\n removeCookie(name: string): void | Promise<void>;\n}\n\nexport class CookieStorageAdapter implements StorageAdapter {\n constructor(private readonly callbacks: CookieStorageCallbacks) {}\n\n async get(key: string): Promise<string | null> {\n return this.callbacks.getCookie(key);\n }\n\n async set(key: string, value: string): Promise<void> {\n await this.callbacks.setCookie(key, value);\n }\n\n async remove(key: string): Promise<void> {\n await this.callbacks.removeCookie(key);\n }\n}\n","import { createAuthClient } from '../client/create-client';\nimport type { AuthClient, AuthConfig } from '../core/types';\nimport { CookieStorageAdapter } from '../storage/cookie-storage-adapter';\n\nexport interface NuxtCookieApi {\n get: (\n name: string,\n ) => string | null | undefined | Promise<string | null | undefined>;\n set: (name: string, value: string) => void | Promise<void>;\n remove: (name: string) => void | Promise<void>;\n}\n\nexport function createNuxtCookieStorageAdapter(\n cookies: NuxtCookieApi,\n): CookieStorageAdapter {\n return new CookieStorageAdapter({\n getCookie: async (name) => (await cookies.get(name)) ?? null,\n setCookie: (name, value) => cookies.set(name, value),\n removeCookie: (name) => cookies.remove(name),\n });\n}\n\nexport function createNuxtAuthClient(\n config: AuthConfig,\n cookies: NuxtCookieApi,\n): AuthClient {\n return createAuthClient({\n ...config,\n storage: createNuxtCookieStorageAdapter(cookies),\n });\n}\n"]}
|
package/dist/react.cjs
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var react = require('react');
|
|
4
|
+
|
|
5
|
+
// src/react/use-auth-session.ts
|
|
6
|
+
function useAuthSession(auth) {
|
|
7
|
+
const [session, setSession] = react.useState(
|
|
8
|
+
() => auth.getSession()
|
|
9
|
+
);
|
|
10
|
+
const [isLoading, setIsLoading] = react.useState(
|
|
11
|
+
() => auth.getSession() === null
|
|
12
|
+
);
|
|
13
|
+
const [error, setError] = react.useState(null);
|
|
14
|
+
react.useEffect(() => {
|
|
15
|
+
let mounted = true;
|
|
16
|
+
const unsubscribe = auth.onAuthStateChanged((nextSession) => {
|
|
17
|
+
if (!mounted) return;
|
|
18
|
+
setSession(nextSession);
|
|
19
|
+
setIsLoading(false);
|
|
20
|
+
});
|
|
21
|
+
const hydrate = async () => {
|
|
22
|
+
try {
|
|
23
|
+
await auth.getAccessToken();
|
|
24
|
+
if (!mounted) return;
|
|
25
|
+
setSession(auth.getSession());
|
|
26
|
+
} catch (err) {
|
|
27
|
+
if (!mounted) return;
|
|
28
|
+
setError(err);
|
|
29
|
+
} finally {
|
|
30
|
+
if (mounted) {
|
|
31
|
+
setIsLoading(false);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
void hydrate();
|
|
36
|
+
return () => {
|
|
37
|
+
mounted = false;
|
|
38
|
+
unsubscribe();
|
|
39
|
+
};
|
|
40
|
+
}, [auth]);
|
|
41
|
+
const refresh = react.useCallback(async () => {
|
|
42
|
+
try {
|
|
43
|
+
await auth.getAccessToken();
|
|
44
|
+
const nextSession = auth.getSession();
|
|
45
|
+
setSession(nextSession);
|
|
46
|
+
setError(null);
|
|
47
|
+
return nextSession;
|
|
48
|
+
} catch (err) {
|
|
49
|
+
setError(err);
|
|
50
|
+
return null;
|
|
51
|
+
} finally {
|
|
52
|
+
setIsLoading(false);
|
|
53
|
+
}
|
|
54
|
+
}, [auth]);
|
|
55
|
+
return {
|
|
56
|
+
session,
|
|
57
|
+
isAuthenticated: session !== null,
|
|
58
|
+
isLoading,
|
|
59
|
+
error,
|
|
60
|
+
refresh
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
var AuthContext = react.createContext(null);
|
|
64
|
+
function AuthProvider({
|
|
65
|
+
auth,
|
|
66
|
+
children
|
|
67
|
+
}) {
|
|
68
|
+
const state = useAuthSession(auth);
|
|
69
|
+
const value = {
|
|
70
|
+
...state,
|
|
71
|
+
auth,
|
|
72
|
+
login: () => auth.startLogin(),
|
|
73
|
+
logout: (options) => auth.logout(options)
|
|
74
|
+
};
|
|
75
|
+
return react.createElement(AuthContext.Provider, { value }, children);
|
|
76
|
+
}
|
|
77
|
+
function useAuth() {
|
|
78
|
+
const context = react.useContext(AuthContext);
|
|
79
|
+
if (!context) {
|
|
80
|
+
throw new Error("useAuth must be used within an AuthProvider");
|
|
81
|
+
}
|
|
82
|
+
return context;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
exports.AuthProvider = AuthProvider;
|
|
86
|
+
exports.useAuth = useAuth;
|
|
87
|
+
exports.useAuthSession = useAuthSession;
|
|
88
|
+
//# sourceMappingURL=react.cjs.map
|
|
89
|
+
//# sourceMappingURL=react.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/react/use-auth-session.ts","../src/react/auth-context.ts"],"names":["useState","useEffect","useCallback","createContext","createElement","useContext"],"mappings":"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","file":"react.cjs","sourcesContent":["import { useCallback, useEffect, useState } from 'react';\nimport type { AuthClient, Session } from '../core/types';\n\nexport interface UseAuthSessionResult {\n session: Session | null;\n isAuthenticated: boolean;\n isLoading: boolean;\n error: unknown;\n refresh: () => Promise<Session | null>;\n}\n\nexport function useAuthSession(auth: AuthClient): UseAuthSessionResult {\n const [session, setSession] = useState<Session | null>(() =>\n auth.getSession(),\n );\n const [isLoading, setIsLoading] = useState<boolean>(\n () => auth.getSession() === null,\n );\n const [error, setError] = useState<unknown>(null);\n\n useEffect(() => {\n let mounted = true;\n const unsubscribe = auth.onAuthStateChanged((nextSession) => {\n if (!mounted) return;\n setSession(nextSession);\n setIsLoading(false);\n });\n\n const hydrate = async () => {\n try {\n await auth.getAccessToken();\n if (!mounted) return;\n setSession(auth.getSession());\n } catch (err) {\n if (!mounted) return;\n setError(err);\n } finally {\n if (mounted) {\n setIsLoading(false);\n }\n }\n };\n\n void hydrate();\n return () => {\n mounted = false;\n unsubscribe();\n };\n }, [auth]);\n\n const refresh = useCallback(async () => {\n try {\n await auth.getAccessToken();\n const nextSession = auth.getSession();\n setSession(nextSession);\n setError(null);\n return nextSession;\n } catch (err) {\n setError(err);\n return null;\n } finally {\n setIsLoading(false);\n }\n }, [auth]);\n\n return {\n session,\n isAuthenticated: session !== null,\n isLoading,\n error,\n refresh,\n };\n}\n","import {\n createContext,\n createElement,\n useContext,\n type ReactNode,\n} from 'react';\nimport type { AuthClient } from '../core/types';\nimport { useAuthSession, type UseAuthSessionResult } from './use-auth-session';\n\nexport interface AuthContextValue extends UseAuthSessionResult {\n auth: AuthClient;\n login: () => Promise<void>;\n logout: (options?: { returnTo?: string }) => Promise<void>;\n}\n\nconst AuthContext = createContext<AuthContextValue | null>(null);\n\nexport function AuthProvider({\n auth,\n children,\n}: {\n auth: AuthClient;\n children: ReactNode;\n}) {\n const state = useAuthSession(auth);\n\n const value: AuthContextValue = {\n ...state,\n auth,\n login: () => auth.startLogin(),\n logout: (options) => auth.logout(options),\n };\n\n return createElement(AuthContext.Provider, { value }, children);\n}\n\nexport function useAuth(): AuthContextValue {\n const context = useContext(AuthContext);\n if (!context) {\n throw new Error('useAuth must be used within an AuthProvider');\n }\n return context;\n}\n"]}
|
package/dist/react.d.cts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { e as Session, a as AuthClient } from './types-2k4ZYpF4.cjs';
|
|
2
|
+
import * as react from 'react';
|
|
3
|
+
import { ReactNode } from 'react';
|
|
4
|
+
|
|
5
|
+
interface UseAuthSessionResult {
|
|
6
|
+
session: Session | null;
|
|
7
|
+
isAuthenticated: boolean;
|
|
8
|
+
isLoading: boolean;
|
|
9
|
+
error: unknown;
|
|
10
|
+
refresh: () => Promise<Session | null>;
|
|
11
|
+
}
|
|
12
|
+
declare function useAuthSession(auth: AuthClient): UseAuthSessionResult;
|
|
13
|
+
|
|
14
|
+
interface AuthContextValue extends UseAuthSessionResult {
|
|
15
|
+
auth: AuthClient;
|
|
16
|
+
login: () => Promise<void>;
|
|
17
|
+
logout: (options?: {
|
|
18
|
+
returnTo?: string;
|
|
19
|
+
}) => Promise<void>;
|
|
20
|
+
}
|
|
21
|
+
declare function AuthProvider({ auth, children, }: {
|
|
22
|
+
auth: AuthClient;
|
|
23
|
+
children: ReactNode;
|
|
24
|
+
}): react.FunctionComponentElement<react.ProviderProps<AuthContextValue | null>>;
|
|
25
|
+
declare function useAuth(): AuthContextValue;
|
|
26
|
+
|
|
27
|
+
export { type AuthContextValue, AuthProvider, type UseAuthSessionResult, useAuth, useAuthSession };
|
package/dist/react.d.ts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { e as Session, a as AuthClient } from './types-2k4ZYpF4.js';
|
|
2
|
+
import * as react from 'react';
|
|
3
|
+
import { ReactNode } from 'react';
|
|
4
|
+
|
|
5
|
+
interface UseAuthSessionResult {
|
|
6
|
+
session: Session | null;
|
|
7
|
+
isAuthenticated: boolean;
|
|
8
|
+
isLoading: boolean;
|
|
9
|
+
error: unknown;
|
|
10
|
+
refresh: () => Promise<Session | null>;
|
|
11
|
+
}
|
|
12
|
+
declare function useAuthSession(auth: AuthClient): UseAuthSessionResult;
|
|
13
|
+
|
|
14
|
+
interface AuthContextValue extends UseAuthSessionResult {
|
|
15
|
+
auth: AuthClient;
|
|
16
|
+
login: () => Promise<void>;
|
|
17
|
+
logout: (options?: {
|
|
18
|
+
returnTo?: string;
|
|
19
|
+
}) => Promise<void>;
|
|
20
|
+
}
|
|
21
|
+
declare function AuthProvider({ auth, children, }: {
|
|
22
|
+
auth: AuthClient;
|
|
23
|
+
children: ReactNode;
|
|
24
|
+
}): react.FunctionComponentElement<react.ProviderProps<AuthContextValue | null>>;
|
|
25
|
+
declare function useAuth(): AuthContextValue;
|
|
26
|
+
|
|
27
|
+
export { type AuthContextValue, AuthProvider, type UseAuthSessionResult, useAuth, useAuthSession };
|
package/dist/react.js
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { createContext, useState, useEffect, useCallback, createElement, useContext } from 'react';
|
|
2
|
+
|
|
3
|
+
// src/react/use-auth-session.ts
|
|
4
|
+
function useAuthSession(auth) {
|
|
5
|
+
const [session, setSession] = useState(
|
|
6
|
+
() => auth.getSession()
|
|
7
|
+
);
|
|
8
|
+
const [isLoading, setIsLoading] = useState(
|
|
9
|
+
() => auth.getSession() === null
|
|
10
|
+
);
|
|
11
|
+
const [error, setError] = useState(null);
|
|
12
|
+
useEffect(() => {
|
|
13
|
+
let mounted = true;
|
|
14
|
+
const unsubscribe = auth.onAuthStateChanged((nextSession) => {
|
|
15
|
+
if (!mounted) return;
|
|
16
|
+
setSession(nextSession);
|
|
17
|
+
setIsLoading(false);
|
|
18
|
+
});
|
|
19
|
+
const hydrate = async () => {
|
|
20
|
+
try {
|
|
21
|
+
await auth.getAccessToken();
|
|
22
|
+
if (!mounted) return;
|
|
23
|
+
setSession(auth.getSession());
|
|
24
|
+
} catch (err) {
|
|
25
|
+
if (!mounted) return;
|
|
26
|
+
setError(err);
|
|
27
|
+
} finally {
|
|
28
|
+
if (mounted) {
|
|
29
|
+
setIsLoading(false);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
void hydrate();
|
|
34
|
+
return () => {
|
|
35
|
+
mounted = false;
|
|
36
|
+
unsubscribe();
|
|
37
|
+
};
|
|
38
|
+
}, [auth]);
|
|
39
|
+
const refresh = useCallback(async () => {
|
|
40
|
+
try {
|
|
41
|
+
await auth.getAccessToken();
|
|
42
|
+
const nextSession = auth.getSession();
|
|
43
|
+
setSession(nextSession);
|
|
44
|
+
setError(null);
|
|
45
|
+
return nextSession;
|
|
46
|
+
} catch (err) {
|
|
47
|
+
setError(err);
|
|
48
|
+
return null;
|
|
49
|
+
} finally {
|
|
50
|
+
setIsLoading(false);
|
|
51
|
+
}
|
|
52
|
+
}, [auth]);
|
|
53
|
+
return {
|
|
54
|
+
session,
|
|
55
|
+
isAuthenticated: session !== null,
|
|
56
|
+
isLoading,
|
|
57
|
+
error,
|
|
58
|
+
refresh
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
var AuthContext = createContext(null);
|
|
62
|
+
function AuthProvider({
|
|
63
|
+
auth,
|
|
64
|
+
children
|
|
65
|
+
}) {
|
|
66
|
+
const state = useAuthSession(auth);
|
|
67
|
+
const value = {
|
|
68
|
+
...state,
|
|
69
|
+
auth,
|
|
70
|
+
login: () => auth.startLogin(),
|
|
71
|
+
logout: (options) => auth.logout(options)
|
|
72
|
+
};
|
|
73
|
+
return createElement(AuthContext.Provider, { value }, children);
|
|
74
|
+
}
|
|
75
|
+
function useAuth() {
|
|
76
|
+
const context = useContext(AuthContext);
|
|
77
|
+
if (!context) {
|
|
78
|
+
throw new Error("useAuth must be used within an AuthProvider");
|
|
79
|
+
}
|
|
80
|
+
return context;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export { AuthProvider, useAuth, useAuthSession };
|
|
84
|
+
//# sourceMappingURL=react.js.map
|
|
85
|
+
//# sourceMappingURL=react.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/react/use-auth-session.ts","../src/react/auth-context.ts"],"names":[],"mappings":"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","file":"react.js","sourcesContent":["import { useCallback, useEffect, useState } from 'react';\nimport type { AuthClient, Session } from '../core/types';\n\nexport interface UseAuthSessionResult {\n session: Session | null;\n isAuthenticated: boolean;\n isLoading: boolean;\n error: unknown;\n refresh: () => Promise<Session | null>;\n}\n\nexport function useAuthSession(auth: AuthClient): UseAuthSessionResult {\n const [session, setSession] = useState<Session | null>(() =>\n auth.getSession(),\n );\n const [isLoading, setIsLoading] = useState<boolean>(\n () => auth.getSession() === null,\n );\n const [error, setError] = useState<unknown>(null);\n\n useEffect(() => {\n let mounted = true;\n const unsubscribe = auth.onAuthStateChanged((nextSession) => {\n if (!mounted) return;\n setSession(nextSession);\n setIsLoading(false);\n });\n\n const hydrate = async () => {\n try {\n await auth.getAccessToken();\n if (!mounted) return;\n setSession(auth.getSession());\n } catch (err) {\n if (!mounted) return;\n setError(err);\n } finally {\n if (mounted) {\n setIsLoading(false);\n }\n }\n };\n\n void hydrate();\n return () => {\n mounted = false;\n unsubscribe();\n };\n }, [auth]);\n\n const refresh = useCallback(async () => {\n try {\n await auth.getAccessToken();\n const nextSession = auth.getSession();\n setSession(nextSession);\n setError(null);\n return nextSession;\n } catch (err) {\n setError(err);\n return null;\n } finally {\n setIsLoading(false);\n }\n }, [auth]);\n\n return {\n session,\n isAuthenticated: session !== null,\n isLoading,\n error,\n refresh,\n };\n}\n","import {\n createContext,\n createElement,\n useContext,\n type ReactNode,\n} from 'react';\nimport type { AuthClient } from '../core/types';\nimport { useAuthSession, type UseAuthSessionResult } from './use-auth-session';\n\nexport interface AuthContextValue extends UseAuthSessionResult {\n auth: AuthClient;\n login: () => Promise<void>;\n logout: (options?: { returnTo?: string }) => Promise<void>;\n}\n\nconst AuthContext = createContext<AuthContextValue | null>(null);\n\nexport function AuthProvider({\n auth,\n children,\n}: {\n auth: AuthClient;\n children: ReactNode;\n}) {\n const state = useAuthSession(auth);\n\n const value: AuthContextValue = {\n ...state,\n auth,\n login: () => auth.startLogin(),\n logout: (options) => auth.logout(options),\n };\n\n return createElement(AuthContext.Provider, { value }, children);\n}\n\nexport function useAuth(): AuthContextValue {\n const context = useContext(AuthContext);\n if (!context) {\n throw new Error('useAuth must be used within an AuthProvider');\n }\n return context;\n}\n"]}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
interface TokenSet {
|
|
2
|
+
accessToken: string;
|
|
3
|
+
tokenType?: string;
|
|
4
|
+
expiresIn?: number;
|
|
5
|
+
refreshToken?: string;
|
|
6
|
+
idToken?: string;
|
|
7
|
+
scope?: string;
|
|
8
|
+
expiresAt?: number;
|
|
9
|
+
}
|
|
10
|
+
interface Session {
|
|
11
|
+
tokens: TokenSet;
|
|
12
|
+
createdAt: number;
|
|
13
|
+
}
|
|
14
|
+
interface StartLoginOptions {
|
|
15
|
+
loginHint?: string;
|
|
16
|
+
scopes?: string[];
|
|
17
|
+
extraParams?: Record<string, string>;
|
|
18
|
+
}
|
|
19
|
+
interface LoginCodeChallengeOptions {
|
|
20
|
+
email: string;
|
|
21
|
+
channel?: 'email' | 'sms';
|
|
22
|
+
destination?: string;
|
|
23
|
+
purpose?: string;
|
|
24
|
+
}
|
|
25
|
+
interface GoogleLoginOptions {
|
|
26
|
+
idToken: string;
|
|
27
|
+
}
|
|
28
|
+
interface PasswordLoginOptions {
|
|
29
|
+
email: string;
|
|
30
|
+
password: string;
|
|
31
|
+
}
|
|
32
|
+
interface VerifyLoginCodeOptions {
|
|
33
|
+
challengeId: string;
|
|
34
|
+
code: string;
|
|
35
|
+
}
|
|
36
|
+
interface TwoFactorChallenge {
|
|
37
|
+
challengeId: string;
|
|
38
|
+
channel: string;
|
|
39
|
+
destinationMasked: string;
|
|
40
|
+
expiresAt: number;
|
|
41
|
+
purpose: string;
|
|
42
|
+
}
|
|
43
|
+
interface StorageAdapter {
|
|
44
|
+
get(key: string): Promise<string | null> | string | null;
|
|
45
|
+
set(key: string, value: string): Promise<void> | void;
|
|
46
|
+
remove(key: string): Promise<void> | void;
|
|
47
|
+
}
|
|
48
|
+
interface AuthTransportRequest {
|
|
49
|
+
method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
|
|
50
|
+
headers?: Record<string, string>;
|
|
51
|
+
credentials?: RequestCredentials;
|
|
52
|
+
query?: Record<string, string | undefined>;
|
|
53
|
+
body?: unknown;
|
|
54
|
+
timeoutMs?: number;
|
|
55
|
+
retries?: number;
|
|
56
|
+
}
|
|
57
|
+
interface AuthTransportResponse<T = unknown> {
|
|
58
|
+
status: number;
|
|
59
|
+
data: T;
|
|
60
|
+
headers: Headers;
|
|
61
|
+
}
|
|
62
|
+
interface AuthTransport {
|
|
63
|
+
request<T = unknown>(url: string, req?: AuthTransportRequest): Promise<AuthTransportResponse<T>>;
|
|
64
|
+
}
|
|
65
|
+
interface TransportInterceptor {
|
|
66
|
+
onRequest?: (url: string, req: AuthTransportRequest) => Promise<AuthTransportRequest> | AuthTransportRequest;
|
|
67
|
+
onResponse?: <T>(res: AuthTransportResponse<T>) => Promise<AuthTransportResponse<T>> | AuthTransportResponse<T>;
|
|
68
|
+
}
|
|
69
|
+
interface AuthConfig {
|
|
70
|
+
clientId: string;
|
|
71
|
+
baseUrl?: string;
|
|
72
|
+
authorizationEndpoint?: string;
|
|
73
|
+
tokenEndpoint?: string;
|
|
74
|
+
redirectUri: string;
|
|
75
|
+
scope?: string;
|
|
76
|
+
logoutEndpoint?: string;
|
|
77
|
+
userinfoEndpoint?: string;
|
|
78
|
+
storage?: StorageAdapter;
|
|
79
|
+
transport?: AuthTransport;
|
|
80
|
+
onRedirect?: (url: string) => void | Promise<void>;
|
|
81
|
+
enableRefreshToken?: boolean;
|
|
82
|
+
now?: () => number;
|
|
83
|
+
}
|
|
84
|
+
interface AuthClient {
|
|
85
|
+
startLogin(options?: StartLoginOptions): Promise<void>;
|
|
86
|
+
handleRedirectCallback(callbackUrl?: string): Promise<Session>;
|
|
87
|
+
getSession(): Session | null;
|
|
88
|
+
getAccessToken(): Promise<string | null>;
|
|
89
|
+
logout(options?: {
|
|
90
|
+
returnTo?: string;
|
|
91
|
+
}): Promise<void>;
|
|
92
|
+
isAuthenticated(): boolean;
|
|
93
|
+
onAuthStateChanged(handler: (session: Session | null) => void): () => void;
|
|
94
|
+
getUserinfo(): Promise<Record<string, unknown>>;
|
|
95
|
+
startLoginCodeChallenge(options: LoginCodeChallengeOptions): Promise<TwoFactorChallenge>;
|
|
96
|
+
verifyLoginCode(options: VerifyLoginCodeOptions): Promise<Session>;
|
|
97
|
+
loginWithCodeSent(options: LoginCodeChallengeOptions): Promise<TwoFactorChallenge>;
|
|
98
|
+
completeLoginWithCode(options: VerifyLoginCodeOptions): Promise<Session>;
|
|
99
|
+
loginWithGoogle(options: GoogleLoginOptions): Promise<Session>;
|
|
100
|
+
loginWithPassword(options: PasswordLoginOptions): Promise<Session>;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export type { AuthConfig as A, GoogleLoginOptions as G, LoginCodeChallengeOptions as L, PasswordLoginOptions as P, StorageAdapter as S, TransportInterceptor as T, VerifyLoginCodeOptions as V, AuthClient as a, AuthTransport as b, AuthTransportRequest as c, AuthTransportResponse as d, Session as e, StartLoginOptions as f, TokenSet as g, TwoFactorChallenge as h };
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
interface TokenSet {
|
|
2
|
+
accessToken: string;
|
|
3
|
+
tokenType?: string;
|
|
4
|
+
expiresIn?: number;
|
|
5
|
+
refreshToken?: string;
|
|
6
|
+
idToken?: string;
|
|
7
|
+
scope?: string;
|
|
8
|
+
expiresAt?: number;
|
|
9
|
+
}
|
|
10
|
+
interface Session {
|
|
11
|
+
tokens: TokenSet;
|
|
12
|
+
createdAt: number;
|
|
13
|
+
}
|
|
14
|
+
interface StartLoginOptions {
|
|
15
|
+
loginHint?: string;
|
|
16
|
+
scopes?: string[];
|
|
17
|
+
extraParams?: Record<string, string>;
|
|
18
|
+
}
|
|
19
|
+
interface LoginCodeChallengeOptions {
|
|
20
|
+
email: string;
|
|
21
|
+
channel?: 'email' | 'sms';
|
|
22
|
+
destination?: string;
|
|
23
|
+
purpose?: string;
|
|
24
|
+
}
|
|
25
|
+
interface GoogleLoginOptions {
|
|
26
|
+
idToken: string;
|
|
27
|
+
}
|
|
28
|
+
interface PasswordLoginOptions {
|
|
29
|
+
email: string;
|
|
30
|
+
password: string;
|
|
31
|
+
}
|
|
32
|
+
interface VerifyLoginCodeOptions {
|
|
33
|
+
challengeId: string;
|
|
34
|
+
code: string;
|
|
35
|
+
}
|
|
36
|
+
interface TwoFactorChallenge {
|
|
37
|
+
challengeId: string;
|
|
38
|
+
channel: string;
|
|
39
|
+
destinationMasked: string;
|
|
40
|
+
expiresAt: number;
|
|
41
|
+
purpose: string;
|
|
42
|
+
}
|
|
43
|
+
interface StorageAdapter {
|
|
44
|
+
get(key: string): Promise<string | null> | string | null;
|
|
45
|
+
set(key: string, value: string): Promise<void> | void;
|
|
46
|
+
remove(key: string): Promise<void> | void;
|
|
47
|
+
}
|
|
48
|
+
interface AuthTransportRequest {
|
|
49
|
+
method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
|
|
50
|
+
headers?: Record<string, string>;
|
|
51
|
+
credentials?: RequestCredentials;
|
|
52
|
+
query?: Record<string, string | undefined>;
|
|
53
|
+
body?: unknown;
|
|
54
|
+
timeoutMs?: number;
|
|
55
|
+
retries?: number;
|
|
56
|
+
}
|
|
57
|
+
interface AuthTransportResponse<T = unknown> {
|
|
58
|
+
status: number;
|
|
59
|
+
data: T;
|
|
60
|
+
headers: Headers;
|
|
61
|
+
}
|
|
62
|
+
interface AuthTransport {
|
|
63
|
+
request<T = unknown>(url: string, req?: AuthTransportRequest): Promise<AuthTransportResponse<T>>;
|
|
64
|
+
}
|
|
65
|
+
interface TransportInterceptor {
|
|
66
|
+
onRequest?: (url: string, req: AuthTransportRequest) => Promise<AuthTransportRequest> | AuthTransportRequest;
|
|
67
|
+
onResponse?: <T>(res: AuthTransportResponse<T>) => Promise<AuthTransportResponse<T>> | AuthTransportResponse<T>;
|
|
68
|
+
}
|
|
69
|
+
interface AuthConfig {
|
|
70
|
+
clientId: string;
|
|
71
|
+
baseUrl?: string;
|
|
72
|
+
authorizationEndpoint?: string;
|
|
73
|
+
tokenEndpoint?: string;
|
|
74
|
+
redirectUri: string;
|
|
75
|
+
scope?: string;
|
|
76
|
+
logoutEndpoint?: string;
|
|
77
|
+
userinfoEndpoint?: string;
|
|
78
|
+
storage?: StorageAdapter;
|
|
79
|
+
transport?: AuthTransport;
|
|
80
|
+
onRedirect?: (url: string) => void | Promise<void>;
|
|
81
|
+
enableRefreshToken?: boolean;
|
|
82
|
+
now?: () => number;
|
|
83
|
+
}
|
|
84
|
+
interface AuthClient {
|
|
85
|
+
startLogin(options?: StartLoginOptions): Promise<void>;
|
|
86
|
+
handleRedirectCallback(callbackUrl?: string): Promise<Session>;
|
|
87
|
+
getSession(): Session | null;
|
|
88
|
+
getAccessToken(): Promise<string | null>;
|
|
89
|
+
logout(options?: {
|
|
90
|
+
returnTo?: string;
|
|
91
|
+
}): Promise<void>;
|
|
92
|
+
isAuthenticated(): boolean;
|
|
93
|
+
onAuthStateChanged(handler: (session: Session | null) => void): () => void;
|
|
94
|
+
getUserinfo(): Promise<Record<string, unknown>>;
|
|
95
|
+
startLoginCodeChallenge(options: LoginCodeChallengeOptions): Promise<TwoFactorChallenge>;
|
|
96
|
+
verifyLoginCode(options: VerifyLoginCodeOptions): Promise<Session>;
|
|
97
|
+
loginWithCodeSent(options: LoginCodeChallengeOptions): Promise<TwoFactorChallenge>;
|
|
98
|
+
completeLoginWithCode(options: VerifyLoginCodeOptions): Promise<Session>;
|
|
99
|
+
loginWithGoogle(options: GoogleLoginOptions): Promise<Session>;
|
|
100
|
+
loginWithPassword(options: PasswordLoginOptions): Promise<Session>;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export type { AuthConfig as A, GoogleLoginOptions as G, LoginCodeChallengeOptions as L, PasswordLoginOptions as P, StorageAdapter as S, TransportInterceptor as T, VerifyLoginCodeOptions as V, AuthClient as a, AuthTransport as b, AuthTransportRequest as c, AuthTransportResponse as d, Session as e, StartLoginOptions as f, TokenSet as g, TwoFactorChallenge as h };
|
package/dist/vue.cjs
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var vue = require('vue');
|
|
4
|
+
|
|
5
|
+
// src/vue/use-auth-session.ts
|
|
6
|
+
function useAuthSession(auth) {
|
|
7
|
+
const session = vue.ref(auth.getSession());
|
|
8
|
+
const isLoading = vue.ref(session.value === null);
|
|
9
|
+
const error = vue.ref(null);
|
|
10
|
+
let unsubscribe = null;
|
|
11
|
+
const hydrate = async () => {
|
|
12
|
+
try {
|
|
13
|
+
await auth.getAccessToken();
|
|
14
|
+
session.value = auth.getSession();
|
|
15
|
+
} catch (err) {
|
|
16
|
+
error.value = err;
|
|
17
|
+
} finally {
|
|
18
|
+
isLoading.value = false;
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
vue.onMounted(() => {
|
|
22
|
+
unsubscribe = auth.onAuthStateChanged((nextSession) => {
|
|
23
|
+
session.value = nextSession;
|
|
24
|
+
isLoading.value = false;
|
|
25
|
+
});
|
|
26
|
+
void hydrate();
|
|
27
|
+
});
|
|
28
|
+
vue.onUnmounted(() => {
|
|
29
|
+
unsubscribe == null ? void 0 : unsubscribe();
|
|
30
|
+
unsubscribe = null;
|
|
31
|
+
});
|
|
32
|
+
const refresh = async () => {
|
|
33
|
+
try {
|
|
34
|
+
await auth.getAccessToken();
|
|
35
|
+
const nextSession = auth.getSession();
|
|
36
|
+
session.value = nextSession;
|
|
37
|
+
error.value = null;
|
|
38
|
+
return nextSession;
|
|
39
|
+
} catch (err) {
|
|
40
|
+
error.value = err;
|
|
41
|
+
return null;
|
|
42
|
+
} finally {
|
|
43
|
+
isLoading.value = false;
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
return {
|
|
47
|
+
session,
|
|
48
|
+
isAuthenticated: vue.computed(() => session.value !== null),
|
|
49
|
+
isLoading,
|
|
50
|
+
error,
|
|
51
|
+
refresh
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
exports.useAuthSession = useAuthSession;
|
|
56
|
+
//# sourceMappingURL=vue.cjs.map
|
|
57
|
+
//# sourceMappingURL=vue.cjs.map
|
package/dist/vue.cjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/vue/use-auth-session.ts"],"names":["ref","onMounted","onUnmounted","computed"],"mappings":";;;;;AAWO,SAAS,eAAe,IAAA,EAA2C;AACxE,EAAA,MAAM,OAAA,GAAUA,OAAA,CAAoB,IAAA,CAAK,UAAA,EAAY,CAAA;AACrD,EAAA,MAAM,SAAA,GAAYA,OAAA,CAAa,OAAA,CAAQ,KAAA,KAAU,IAAI,CAAA;AACrD,EAAA,MAAM,KAAA,GAAQA,QAAa,IAAI,CAAA;AAC/B,EAAA,IAAI,WAAA,GAAmC,IAAA;AAEvC,EAAA,MAAM,UAAU,YAAY;AAC1B,IAAA,IAAI;AACF,MAAA,MAAM,KAAK,cAAA,EAAe;AAC1B,MAAA,OAAA,CAAQ,KAAA,GAAQ,KAAK,UAAA,EAAW;AAAA,IAClC,SAAS,GAAA,EAAK;AACZ,MAAA,KAAA,CAAM,KAAA,GAAQ,GAAA;AAAA,IAChB,CAAA,SAAE;AACA,MAAA,SAAA,CAAU,KAAA,GAAQ,KAAA;AAAA,IACpB;AAAA,EACF,CAAA;AAEA,EAAAC,aAAA,CAAU,MAAM;AACd,IAAA,WAAA,GAAc,IAAA,CAAK,kBAAA,CAAmB,CAAC,WAAA,KAAgB;AACrD,MAAA,OAAA,CAAQ,KAAA,GAAQ,WAAA;AAChB,MAAA,SAAA,CAAU,KAAA,GAAQ,KAAA;AAAA,IACpB,CAAC,CAAA;AACD,IAAA,KAAK,OAAA,EAAQ;AAAA,EACf,CAAC,CAAA;AAED,EAAAC,eAAA,CAAY,MAAM;AAChB,IAAA,WAAA,IAAA,IAAA,GAAA,MAAA,GAAA,WAAA,EAAA;AACA,IAAA,WAAA,GAAc,IAAA;AAAA,EAChB,CAAC,CAAA;AAED,EAAA,MAAM,UAAU,YAAY;AAC1B,IAAA,IAAI;AACF,MAAA,MAAM,KAAK,cAAA,EAAe;AAC1B,MAAA,MAAM,WAAA,GAAc,KAAK,UAAA,EAAW;AACpC,MAAA,OAAA,CAAQ,KAAA,GAAQ,WAAA;AAChB,MAAA,KAAA,CAAM,KAAA,GAAQ,IAAA;AACd,MAAA,OAAO,WAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,KAAA,CAAM,KAAA,GAAQ,GAAA;AACd,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,SAAE;AACA,MAAA,SAAA,CAAU,KAAA,GAAQ,KAAA;AAAA,IACpB;AAAA,EACF,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,eAAA,EAAiBC,YAAA,CAAS,MAAM,OAAA,CAAQ,UAAU,IAAI,CAAA;AAAA,IACtD,SAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF;AACF","file":"vue.cjs","sourcesContent":["import { computed, onMounted, onUnmounted, ref, type Ref } from 'vue';\nimport type { AuthClient, Session } from '../core/types';\n\nexport interface UseVueAuthSessionResult {\n session: Ref<Session | null>;\n isAuthenticated: Readonly<Ref<boolean>>;\n isLoading: Ref<boolean>;\n error: Ref<unknown>;\n refresh: () => Promise<Session | null>;\n}\n\nexport function useAuthSession(auth: AuthClient): UseVueAuthSessionResult {\n const session = ref<Session | null>(auth.getSession());\n const isLoading = ref<boolean>(session.value === null);\n const error = ref<unknown>(null);\n let unsubscribe: (() => void) | null = null;\n\n const hydrate = async () => {\n try {\n await auth.getAccessToken();\n session.value = auth.getSession();\n } catch (err) {\n error.value = err;\n } finally {\n isLoading.value = false;\n }\n };\n\n onMounted(() => {\n unsubscribe = auth.onAuthStateChanged((nextSession) => {\n session.value = nextSession;\n isLoading.value = false;\n });\n void hydrate();\n });\n\n onUnmounted(() => {\n unsubscribe?.();\n unsubscribe = null;\n });\n\n const refresh = async () => {\n try {\n await auth.getAccessToken();\n const nextSession = auth.getSession();\n session.value = nextSession;\n error.value = null;\n return nextSession;\n } catch (err) {\n error.value = err;\n return null;\n } finally {\n isLoading.value = false;\n }\n };\n\n return {\n session,\n isAuthenticated: computed(() => session.value !== null),\n isLoading,\n error,\n refresh,\n };\n}\n"]}
|