Executando verificação de segurança...
-3

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
Carregando publicação patrocinada...