ai-auth
Version:
Complete Auth-Agent SDK - Agent authentication for AI developers + OAuth client integration for website developers
86 lines • 2.69 kB
JavaScript
;
/**
* 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