Skip to content

@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:

ПараметрТипОписание
d1D1DatabaseCloudflare D1 binding
masterKeystringКлюч шифрования (мин. 32 символа)
saltstringСоль для 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