UNPKG

ai-auth

Version:

Complete Auth-Agent SDK - Agent authentication for AI developers + OAuth client integration for website developers

86 lines 2.69 kB
"use strict"; /** * Utility functions for api.oAuth-Agent SDK */ Object.defineProperty(exports, "__esModule", { value: true }); exports.generatePKCE = generatePKCE; exports.generatePKCEAsync = generatePKCEAsync; exports.generateState = generateState; exports.parseJWT = parseJWT; exports.isTokenExpired = isTokenExpired; exports.getTimeUntilExpiry = getTimeUntilExpiry; /** * Base64 URL encode a buffer */ function base64URLEncode(buffer) { const base64 = btoa(String.fromCharCode(...Array.from(buffer))); return base64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, ''); } /** * Generate PKCE code verifier and challenge (synchronous, simplified) * Note: This version doesn't use proper SHA-256 hashing * Use generatePKCEAsync() for production */ function generatePKCE() { const array = new Uint8Array(32); crypto.getRandomValues(array); const codeVerifier = base64URLEncode(array); const codeChallenge = base64URLEncode(array); return { codeVerifier, codeChallenge }; } /** * Generate PKCE code verifier and challenge (async, with SHA-256) * This is the recommended function for OAuth 2.1 compliance */ async function generatePKCEAsync() { // Generate code verifier (random string) const array = new Uint8Array(32); crypto.getRandomValues(array); const codeVerifier = base64URLEncode(array); // Generate code challenge (SHA-256 hash of verifier) const encoder = new TextEncoder(); const data = encoder.encode(codeVerifier); const hashBuffer = await crypto.subtle.digest('SHA-256', data); const hashArray = new Uint8Array(hashBuffer); const codeChallenge = base64URLEncode(hashArray); return { codeVerifier, codeChallenge }; } /** * Generate a random state parameter for CSRF protection */ function generateState() { const array = new Uint8Array(16); crypto.getRandomValues(array); return base64URLEncode(array); } /** * Parse JWT token (without verification) * Only use for reading claims, not for security validation */ function parseJWT(token) { try { const parts = token.split('.'); if (parts.length !== 3) { throw new Error('Invalid JWT format'); } const payload = parts[1]; const decoded = atob(payload.replace(/-/g, '+').replace(/_/g, '/')); return JSON.parse(decoded); } catch { return null; } } /** * Check if token is expired */ function isTokenExpired(expiresAt) { return expiresAt <= Date.now(); } /** * Get time until token expires (in milliseconds) */ function getTimeUntilExpiry(expiresAt) { return Math.max(0, expiresAt - Date.now()); } //# sourceMappingURL=utils.js.map