UNPKG

@theoptimalpartner/jwt-auth-validator

Version:

JWT token validation package with offline JWKS validation and Redis-based token revocation support

67 lines 2.07 kB
export class ApiKeyValidator { redisService; constructor(redisService) { this.redisService = redisService; } async validateApiKey(apiKey) { if (!apiKey || !/^[a-fA-F0-9]{64}$/.test(apiKey)) { return { valid: false, error: 'Invalid API key format' }; } try { const keyData = await this.redisService.get(`api-keys:${apiKey}`); if (!keyData) { return { valid: false, error: 'API key not found' }; } const parsed = JSON.parse(keyData); if (!parsed.isActive) { return { valid: false, error: 'API key is inactive' }; } this.updateLastUsed(apiKey, parsed).catch(console.error); return { valid: true, keyData: parsed }; } catch (error) { console.error('Error validating API key:', error); return { valid: false, error: 'API key validation failed' }; } } async updateLastUsed(apiKey, keyData) { try { keyData.lastUsed = Date.now(); await this.redisService.set(`api-keys:${apiKey}`, JSON.stringify(keyData), 0); } catch (error) { console.error('Error updating last used timestamp:', error); } } hasPermission(keyData, permission) { return keyData.permissions.includes(permission); } isSystemApiKey(keyData) { return keyData.scope === 'system'; } isClientApiKey(keyData) { return keyData.scope === 'client'; } canAccessApp(keyData, appId) { if (keyData.scope === 'system') return true; const contextAppId = keyData.appId || keyData.metadata?.appId; return contextAppId === appId; } } //# sourceMappingURL=api-key-validator.js.map