quantictech-subscription-components
Version:
Biblioteca de componentes reutilizáveis para sistema de assinatura com Stripe - Arquitetura Service-to-Service
165 lines (126 loc) • 4.62 kB
Markdown
# 🔒 Guia de Segurança
## 🛡️ O que é Seguro na Biblioteca
### ✅ Conteúdo SEGURO (está na biblioteca):
- Componentes React (interface)
- Hooks personalizados
- Funções utilitárias (formatação)
- Tipos TypeScript
- Templates de código (para copiar)
### ❌ O que NUNCA está na biblioteca:
- Chaves secretas do Stripe
- Tokens de autenticação
- Dados de usuários
- Informações de pagamento
- Credenciais de banco de dados
## 🔐 Como Manter a Segurança
### 1. Variáveis de Ambiente (Por Projeto)
Cada projeto deve ter suas próprias variáveis:
```bash
# .env.local (cada projeto)
STRIPE_SECRET_KEY=sk_test_SUA_CHAVE_SECRETA_UNICA
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=pk_test_SUA_CHAVE_PUBLICA_UNICA
STRIPE_WEBHOOK_SECRET=whsec_SEU_WEBHOOK_SECRET_UNICO
```
**⚠️ NUNCA faça:**
```typescript
// ❌ NUNCA hardcode chaves na biblioteca
const stripe = new Stripe('sk_test_123456789'); // PERIGOSO!
// ✅ SEMPRE use variáveis de ambiente
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY); // SEGURO!
```
### 2. APIs Independentes (Por Projeto)
```bash
# ✅ Templates são COPIADOS (não centralizados)
cp templates/webhook-api/* pages/api/
# Cada projeto tem suas próprias APIs em:
meu-projeto-1/pages/api/webhook.ts
meu-projeto-2/pages/api/webhook.ts
```
### 3. Lógica de Negócio Separada
```typescript
// ✅ Cada projeto implementa sua lógica
async function handleSubscriptionCreated(subscription) {
// Conecta ao SEU banco específico
await YOUR_DATABASE.subscriptions.create({
stripeId: subscription.id,
userId: subscription.metadata.userId
});
// Envia email com SUA configuração
await YOUR_EMAIL_SERVICE.send({
to: subscription.metadata.customerEmail,
template: 'welcome'
});
}
```
## 🚨 Checklist de Segurança
### Para a Biblioteca:
- [ ] ✅ Não contém chaves hardcoded
- [ ] ✅ Usa apenas process.env para acessar variáveis
- [ ] ✅ Templates são apenas código para copiar
- [ ] ✅ Não executa lógica de negócio sensível
### Para Cada Projeto:
- [ ] ✅ Variáveis de ambiente configuradas
- [ ] ✅ Chaves diferentes para dev/prod
- [ ] ✅ APIs copiadas e customizadas
- [ ] ✅ Webhooks configurados corretamente
- [ ] ✅ Logs não exposem dados sensíveis
## 🌐 Publicação Segura
### Biblioteca Pública é SEGURA porque:
1. **Não há dados sensíveis** - apenas código de interface
2. **Cada projeto é independente** - suas próprias chaves e APIs
3. **Templates não executam** - são apenas modelos para copiar
4. **Padrão da indústria** - MUI, Stripe SDK são públicos
### Exemplo de bibliotecas públicas similares:
- `@stripe/react-stripe-js` (oficial do Stripe)
- `@mui/material` (interface)
- `next` (framework)
## 🔄 Boas Práticas
### 1. Rotação de Chaves
```bash
# Mude periodicamente as chaves do Stripe
STRIPE_SECRET_KEY=sk_test_nova_chave_123
```
### 2. Ambientes Separados
```bash
# Desenvolvimento
STRIPE_SECRET_KEY=sk_test_...
# Produção
STRIPE_SECRET_KEY=sk_live_...
```
### 3. Monitoramento
```bash
# Monitore logs do Stripe
Dashboard → Webhooks → View logs
Dashboard → Payments → View details
```
### 4. Validação de Webhooks
```typescript
// ✅ Sempre valide a assinatura do webhook
const sig = req.headers['stripe-signature'];
const event = stripe.webhooks.constructEvent(body, sig, endpointSecret);
```
## ⚡ Vantagens da Biblioteca Pública
### Segurança:
- ✅ Código auditável pela comunidade
- ✅ Updates de segurança automáticos
- ✅ Padrões da indústria
### Manutenção:
- ✅ Correções centralizadas
- ✅ Melhorias automáticas via `npm update`
- ✅ Comunidade pode contribuir
### Desenvolvimento:
- ✅ Setup rápido em novos projetos
- ✅ Documentação centralizada
- ✅ Exemplos de uso
## 🚨 Quando NÃO usar biblioteca pública
- ❌ Se você hardcoda informações sensíveis (mas isso seria má prática)
- ❌ Se tem lógica de negócio muito proprietária (mas isso deveria estar no projeto, não na lib)
- ❌ Se precisa de controle total sobre quem usa (rare casos corporativos)
## ✅ Conclusão
**A biblioteca É SEGURA para ser pública** porque:
1. Contém apenas código de interface
2. Não executa lógica sensível
3. Cada projeto mantém suas próprias chaves
4. Segue padrões da indústria (Stripe, MUI, etc.)
---
**🛡️ Lembre-se: A segurança está na configuração de cada projeto, não na biblioteca!**