@happ-integ/creds
Управление зашифрованными credentials в Cloudflare D1.
Установка
bash
pnpm add @happ-integ/credsОписание
Хранит credentials для каждой интеграции в зашифрованном виде в Cloudflare D1.
- Шифрование: AES-256-GCM + PBKDF2 (100k итераций)
- Ключ: CRYPTO_KEY из Doppler
- Соль: CRYPTO_SALT из Doppler
- Хранилище: Cloudflare D1
Использование
Получение credentials
typescript
import { Creds } from "@happ-integ/creds";
const creds = new Creds({
d1: env.DB,
masterKey: env.CRYPTO_KEY,
salt: env.CRYPTO_SALT,
});
// Получить все credentials для интеграции
interface SofaSecrets {
NETHUNT_API_KEY: string;
NETHUNT_EMAIL: string;
VOICE_URL: string;
}
const secrets = await creds.get<SofaSecrets>("sofa");
console.log(secrets.NETHUNT_API_KEY);Управление credentials (CLI/Admin)
typescript
// Установить credential
await creds.set("sofa", "NETHUNT_API_KEY", "secret-key");
// Получить один credential
const apiKey = await creds.getOne("sofa", "NETHUNT_API_KEY");
// Удалить credential
await creds.delete("sofa", "NETHUNT_API_KEY");
// Удалить все credentials интеграции
await creds.deleteAll("sofa");Список интеграций и ключей
typescript
// Список всех интеграций
const integrations = await creds.listIntegrations();
// => ["sofa", "booking", "other"]
// Список ключей для интеграции (без значений)
const keys = await creds.listKeys("sofa");
// => ["NETHUNT_API_KEY", "NETHUNT_EMAIL", "VOICE_URL"]API
Creds
typescript
new Creds(config: CredsConfig)Config:
| Параметр | Тип | Описание |
|---|---|---|
d1 | D1Database | Cloudflare D1 binding |
masterKey | string | Ключ шифрования (мин. 32 символа) |
salt | string | Соль для PBKDF2 (мин. 16 символов) |
Методы
get<T>(integrationName): Promise<T>
Получить все credentials для интеграции.
getOne(integrationName, key): Promise<string | null>
Получить один credential.
set(integrationName, key, value): Promise<void>
Установить credential (upsert).
delete(integrationName, key): Promise<void>
Удалить credential.
deleteAll(integrationName): Promise<void>
Удалить все credentials интеграции.
listIntegrations(): Promise<string[]>
Список всех интеграций.
listKeys(integrationName): Promise<string[]>
Список ключей для интеграции.
Схема D1
sql
CREATE TABLE creds (
id TEXT PRIMARY KEY,
integration_name TEXT NOT NULL,
key TEXT NOT NULL,
encrypted_value TEXT NOT NULL,
created_at TEXT,
updated_at TEXT,
UNIQUE(integration_name, key)
);Безопасность
- Credentials шифруются с помощью AES-256-GCM
- Ключ деривируется через PBKDF2 (100,000 итераций, SHA-256)
- CRYPTO_KEY и CRYPTO_SALT хранятся только в Doppler
- В D1 хранятся только зашифрованные значения
- Каждый credential шифруется с уникальным IV