GNL
Dokümanlar menüsü
Enterprise@gnldev/auth-ee

İmzalı lisans (Enterprise)

Ed25519 imzalı lisans anahtarını doğrular; geçerliyse premium EE katmanı açılır, geçersiz/expired ise ücretsize düşer veya failClosed ile boot durur.

Ne işe yarar / ne zaman kullanılır#

@gnldev/auth-ee, ücretsiz @gnldev/auth'ın AuthProvider sözleşmesini implemente eden paralı bir katmandır: RBAC, SSO, journal-destekli kullanıcı yönetimi ve audit gibi premium özellikleri, geçerli bir lisans anahtarı olmadan açmaz. Lisans doğrulaması tamamen offlinedır — telemetri/phone-home yoktur, imza Ed25519 ile yerelde kontrol edilir. Bir dağıtımı satarken ya da self-host müşterisine EE özellikleri kilitli teslim ederken kullanılır: müşteri bir lisans anahtarı alır, host bunu createEnterpriseAuth'a verir; geçersizse (veya süresi dolmuşsa) sistem otomatik olarak ücretsiz fallback davranışına düşer — failClosed: true ile bu düşüş yerine boot tamamen durdurulabilir (paralı dağıtımlarda önerilen mod: yanlış/expired anahtarla premiumsuz sessizce çalışmayı engeller).

Kurulum / import#

import
import {
  createEnterpriseAuth,
  generateLicenseKeys,
  signLicense,
  validateLicense,
  assertLicensed,
} from '@gnldev/auth-ee';

Ayrı bir alt-paket yolu yok — tüm export'lar @gnldev/auth-ee kök girişinden gelir (paket içeride license, rbac, sso, users, user-store ve audit modüllerini yeniden export eder).

Adım adım kullanım#

1. Satıcı tarafında bir kez Ed25519 anahtar çifti üretin ve müşteri için bir lisans imzalayın:

satıcı — anahtar üret + lisans imzala
const keys = generateLicenseKeys();
const license = signLicense(
  { sub: 'demo-musteri', plan: 'enterprise', exp: Date.now() + 365 * 86_400_000, seats: 5 },
  keys.privateKey,
);

const check = validateLicense(license, { publicKey: keys.publicKey });
if (!check.valid) throw new Error(`unexpected: the generated license is invalid (${check.reason})`);
// license goes to the customer as GNL_LICENSE_KEY
// keys.publicKey goes to the customer as GNL_EE_PUBLIC_KEY
// keys.privateKey the VENDOR SECRET: never distributed, stays in the vault

signLicense'e verilen exp sonlu bir epoch-ms sayı olmalıdır; geçersiz bir tarih (ör. NaN) verilirse fonksiyon fırlatır — aksi halde sessizce süresiz bir lisans üretilirdi. features belirtilmezse lisans plan ne olursa olsun TÜM EE özelliklerini açar; kısıtlı bir lisans için features: ['rbac', 'audit'] gibi bir alt küme verilebilir.

2. Müşteri/host tarafında lisansı createEnterpriseAuth'a verip auth katmanını kurun:

host — fail-closed EE auth
const auth = createEnterpriseAuth({
  licenseKey: process.env.GNL_LICENSE_KEY,
  publicKey: process.env.GNL_EE_PUBLIC_KEY,
  failClosed: true,
  userStore,
  audit: createJournalAuditSink(toJournal(storage.runs)),
  fallback: roleAuth({
    admin: { token: ADMIN_TOKEN, user: 'ops' },
    viewer: { token: ACME_TOKEN, orgId: 'acme' },
  }),
});

createEnterpriseAuth lisansı validateLicense ile kontrol eder: geçerliyse RBAC + (varsa) SSO + journal-destekli userStore + audit kompoze eden bir AuthProvider döner; geçersizse ve failClosed: true ise fırlatır (boot durur), failClosed verilmemiş/false ise uyarı loglayıp fallback'i döner (premium kapalı, ücretsiz davranış devam eder). GNL_EE_PUBLIC_KEY env'i publicKey opsiyonu verilmezse otomatik okunur.

3. Premium bir yolu (ör. özel bir yönetim ucu) lisans olmadan asla açmayacaksanız, doğrulama sonucunu doğrudan zorlayabilirsiniz:

özel bir yolda lisansı zorla
const info = validateLicense(process.env.GNL_LICENSE_KEY, { publicKey: process.env.GNL_EE_PUBLIC_KEY });
assertLicensed(info); // throws when invalid the caller should fall back
Yerel geliştirme
İmzalı bir lisans üretmeden hızlıca denemek için GNL_EE_DEV_LICENSE env'ine rastgele bir değer koyup licenseKey'i bununla TAM eşleştirin — plan: 'dev', tüm özellikler açık sayılır. Eski ee_ önekli imzasız anahtarlar ise yalnız GNL_EE_ALLOW_UNSIGNED=1 iken kabul edilir; ikisi de üretimde KULLANILMAMALIDIR.

Bir lisansın ne kadar geçerli kalacağını sınırlamak#

Gerçekten yaşanan durum için iki seçenek var: anahtar sızar, ya da deneme için verilmiş bir lisans bir yıl sonra hâlâ kullanılıyordur. requireExp hiç exp taşımayan lisansı reddeder — o olmadan, son kullanma tarihi konmadan basılmış bir yük asla sona ermez. maxLifetimeMs ise son kullanmayı izin verdiğinizden uzağa koyanı reddeder; on yıllığına basılmış bir anahtar, yalnızca bir yıl isteyen bir kurulumda kabul edilemez. İkisi de varsayılan olarak kapalı: açmak kendi lisans basma pratiğinizle ilgili bir karar, ve mevcut anahtarları reddeden bir varsayılan yanlış türde bir sürpriz olurdu.

src/index.ts
const auth = createEnterpriseAuth({
  licenseKey: process.env.GNL_LICENSE_KEY,
  failClosed: true,        // invalid licence throw at boot, do not drop to free silently
  requireExp: true,        // refuse a licence that never expires
  maxLifetimeMs: 365 * 24 * 60 * 60 * 1000,  // ...and one valid for longer than a year
});

İnce taneli yetkilendirme (FGA)#

RBAC “bu rol bu TÜR şeyi yapabilir mi” sorusunu cevaplar. FGA aynı soruyu NESNE bazında sorar: bu özne bu koşuyu okuyabilir mi, bu iş akışını devam ettirebilir mi. createFga bir kaynak ve eylem üstünde kurallar alır; host bunu kaba izin kontrolünden sonra danışır, yani red sessiz bir boş sonuç değil FgaDeniedError olur ve recordFgaDecision kararı denetim kaydına yazar. Diğerleri gibi bir lisans özelliğidir — ücretsiz katmanda yoktur, lisansı onu taşımayan bir kurulumda da yoktur.

API referansı#

fncreateEnterpriseAuth

EnterpriseAuthOptions alır; lisans geçerliyse RBAC/SSO/userStore/audit kompoze eden AuthProvider döner, geçersizse fallback'e düşer (failClosed: true ise fırlatır).

typeEnterpriseAuthOptions

{ licenseKey?, fallback?, publicKey?, failClosed?, requireExp?, maxLifetimeMs?, rbac?, sso?, users?, userStore?, audit?, fga? } — createEnterpriseAuth'un girdisi.

fnvalidateLicense

(key?, { publicKey?, now? }) → LicenseInfo. eeL1 imzalı formatı Ed25519 ile doğrular, exp kontrolü yapar; dev/unsigned kaçış yollarını da destekler.

fnsignLicense

(payload: LicensePayload, privateKey) → imzalı lisans anahtarı ("eeL1.<payload>.<imza>"). Satıcı tarafında, private key ile.

fngenerateLicenseKeys

() → { publicKey, privateKey } (base64url DER). Satıcı tarafında BİR KEZ çağrılır; private key kasada kalır.

fnassertLicensed

LicenseInfo alır; valid değilse fırlatır. Premium bir yolu açmadan önce ek bir zorlama noktası olarak kullanılır.

typeLicenseInfo

{ valid, plan?, features?, reason?, sub?, exp?, seats? } — validateLicense çıktısı; plan/exp Studio'daki lisans rozetine akar.

typeLicensePayload

{ sub, plan, exp?, seats?, features? } — signLicense girdisi; exp verilmezse süresiz, features verilmezse tüm EE özellikleri açılır.

Lisans gerektirir
Bu paket ve içindeki RBAC/SSO/user-store/audit özellikleri, geçerli ve süresi dolmamış bir lisans anahtarı olmadan çalışmaz — failClosed: false (varsayılan) ile geçersiz lisansta sessizce fallback'e düşülür; üretimde bunun fark edilmeden premiumsuz çalışmasını istemiyorsanız failClosed: true kullanın.