Implementação de Multi-Tenant em um software com gerenciamento de API Keys
Antes de começar essa publicação, vamos explicar o que é Tenant:
Tenant pode ser considerado como usuário ou uma empresa, depende do seu ponto de vista.
Nessa publicação vamos falar sobre a implementação de multiusuários em um software utilizando o mesmo banco de dados e como funcionaria o gerenciamento das API Keys para esses usuários.
(Lembrando que essa é apenas uma solução de várias conhecidas no mercado).
A implementação de multiusuários para uma tabela de publicações pode ser utilizado uma coluna nessa tabela onde especifica o ID desse usuário. Para garantir a segurança dos dados, é necessário um bom filtro de ID nas queries, evitando que os usuários acessem dados de outros usuários.
Gerenciamento das API Keys
Podemos fazer o gerenciamento das API Keys utilizando JWT (Json Web Token), passando o tenant_id(user_id) como payload para o JWT com uma expiração de 1 ano.
Com isso, realizando o decode do JWT, sempre iremos ter o tenant_id para saber de quem está vindo a requisição e aplicar o filtro correspondente nas consultas.
Código em python de referência/exemplo:
import jwt
from datetime import datetime, timedelta
SECRET = "chave_super_secreta"
def generate_jwt_key(tenant_id):
payload = {
"tenant_id": tenant_id,
"exp": datetime.utcnow() + timedelta(days=365)
}
return jwt.encode(payload, SECRET, algorithm="HS256")
def decode_jwt_key(token: str):
"""
Decodifica um JWT e retorna o payload.
Retorna None se o token for inválido ou estiver expirado.
"""
try:
payload = jwt.decode(token, SECRET, algorithms=["HS256"])
return payload # exemplo: {"tenant_id": "user123", "exp": ...}
except jwt.ExpiredSignatureError:
print("Token expirado.")
return None
except jwt.InvalidTokenError:
print("Token inválido.")
return None