@theoptimalpartner/jwt-auth-validator
Version:
JWT token validation package with offline JWKS validation and Redis-based token revocation support
67 lines • 2.07 kB
JavaScript
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