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