Pular para o conteúdo principal

Framework integration guides

A partir da v4.5, o repo do produto inclui 8 guides específicos por framework para integrar CipherVault em apps reais. Esta página é um índice rápido; os guides completos estão no monorepo do produto em docs/integrations/.

Frameworks cobertos​

FrameworkStackPadrão recomendado
ViteFrontend JS/TS, SPABuild-time injection via env vars
Next.jsReact + SSR/SSGOIDC pull no getServerSideProps ou app/router
LaravelPHPSDK PHP (community) + .env populated via SDK boot
DjangoPythonciphervault-sdk em settings.py, lazy load
FastAPIPython asyncDependency injection + SDK async
RailsRubyciphervault-sdk (community) + Rails.application.credentials shim
Spring BootJavaciphervault-spring-boot-starter (auto-config)
ExpressNode.jsMiddleware + SDK Node Consumer

Padrões transversais​

1. Build-time vs runtime​

  • Build-time: secrets resolvidos durante build (Vite, Next.js SSG). Resultado fica empacotado — NUNCA use isso para secrets sensíveis (vão para o bundle do client).
  • Runtime: secrets buscados no boot do server ou na primeira request. Apropriado para back-end.

2. OIDC sempre que possível​

Em CI/CD que faz build/deploy, use OIDC Federation para autenticar o pipeline no CV. Sem secret estático.

Em runtime no servidor, prefira Workload Identity (K8s SA, AWS IAM, GCP IAM, Azure MSI, SPIFFE) quando disponível.

3. AppConnection com escopo mínimo​

Cada app/microsserviço tem AppConnection própria, com vault_ids escopados e allowed_paths específicos. Não compartilhe credentials entre apps.

4. Cache local + refresh​

SDKs cacheiam secrets em memória (default 60s). Configure cache_ttl_seconds conforme criticidade — rotação refresh dentro do TTL.

5. Health probes incluem CipherVault​

Health endpoint do app valida que SDK consegue ler secret de teste:

@app.get("/health/deep")
def health_deep():
try:
cv.secrets.get(vault=os.environ["VAULT"], path="health/probe")
return {"ciphervault": "ok"}
except Exception as e:
return JSONResponse(status_code=503, content={"ciphervault": str(e)})

Exemplos rápidos​

Spring Boot​

<dependency>
<groupId>io.ciphervault</groupId>
<artifactId>ciphervault-spring-boot-starter</artifactId>
<version>4.5.0</version>
</dependency>
# application.yml
ciphervault:
base-url: https://cv.acme.com.br
client-id: ${CV_CLIENT_ID}
cert-path: /run/cv/client.crt
key-path: /run/cv/client.key
vault: producao
@Service
public class StripeService {
@CVSecret("api/stripe/secret_key")
private String stripeKey;
// ...
}

Next.js (App Router)​

// app/billing/page.tsx
import { CipherVault } from '@ciphervault/sdk';

const cv = new CipherVault({ /* ... */ });

export default async function BillingPage() {
const apiKey = await cv.fetchByPath({
vault: 'producao',
secret: 'api/stripe/secret_key',
});
// apiKey nunca chega ao client component
return <BillingDashboard apiKeyMasked={apiKey.slice(-4)} />;
}

FastAPI​

from fastapi import FastAPI, Depends
from ciphervault import Client

app = FastAPI()

async def get_cv():
# Singleton via lifespan
return app.state.cv

@app.get("/process")
async def process(cv: Client = Depends(get_cv)):
secret = await cv.secrets.get(vault="producao", path="api/openai/key")
return {"masked": secret.value[-4:]}

Express​

const { CipherVault } = require('@ciphervault/sdk');
const app = express();

const cv = new CipherVault({ /* config */ });

app.use(async (req, res, next) => {
req.cv = cv;
next();
});

app.get('/api/data', async (req, res) => {
const secret = await req.cv.secrets.get({ vault: 'producao', path: 'api/foo' });
// ...
});

Onde encontrar os guides completos​

Guides com exemplos completos, error handling, testes e best practices específicas vivem no repo do produto:

📁 docs/integrations/ no monorepo do CipherVault

Arquivos disponíveis:

  • vite.md
  • nextjs.md
  • laravel.md
  • django.md
  • fastapi.md
  • rails.md
  • spring-boot.md
  • express.md

Não vê seu framework?​

  • Use SDK direto — Python, Node, Java, Go, C# cobrem 95% dos cenários
  • CLI Go cv — pipe-friendly, funciona em qualquer linguagem
  • Secretless Proxy — Postgres/MySQL/Redis/MongoDB sem mudar app
  • REST API — última opção (cuidado com mTLS handshake manual)