feat(): Refeito logica de entrega de url protegidas por token

This commit is contained in:
Kenio 2025-11-12 11:21:49 -03:00
parent faa079fc53
commit 5ce1909eee
3 changed files with 46 additions and 29 deletions

View file

@ -1,9 +1,11 @@
# utils/hash_generator.py
from jose import jwt
from datetime import datetime, timedelta
from datetime import date
import hashlib
# Função que gera o hash baseado na data atual
def generate_storage_hash() -> str:
"""
Gera um hash SHA-256 baseado na data atual no formato YYYYMMDD.
@ -26,3 +28,21 @@ def generate_storage_hash() -> str:
# Retorna o hash em formato hexadecimal
return h.hexdigest()
# Função que gera o token temporário para acesso ao documento
def generate_temporary_token(
file_id: str,
filename: str,
expires_minutes: int,
secret_key: str,
algorithm: str,
) -> str:
"""Gera um token JWT válido por poucos minutos."""
expire = datetime.utcnow() + timedelta(minutes=expires_minutes)
payload = {
"sub": file_id,
"filename": filename,
"exp": expire,
}
return jwt.encode(payload, secret_key, algorithm=algorithm)

17
main.py
View file

@ -15,8 +15,6 @@ from pathlib import Path
from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import Response
from starlette.middleware.base import BaseHTTPMiddleware
from actions.validations.hash import generate_storage_hash
from actions.validations.staticFiles import ProtectedStaticFiles
# Importa middleware de captura de erros junto ao banco de dados
from middlewares.error_handler import database_error_handler
@ -35,21 +33,6 @@ config = Config.get("app.json")
# Instancia o app FastAPI com um título personalizado
app = FastAPI(title="Mirror | Orius")
# 1. Defina o caminho local absoluto da sua pasta de arquivos
STORAGE_DIR = "/app/storage"
# 2. Opcional: Crie o diretório se ele não existir
if not os.path.isdir(STORAGE_DIR):
os.makedirs(STORAGE_DIR)
# 3. Monte o diretório estático
# Isso mapeia o caminho local STORAGE_DIR para o prefixo de URL '/storage-files'
app.mount(
"/" + generate_storage_hash(), # <- ESTE É O PREFIXO DA URL PÚBLICA
ProtectedStaticFiles(directory=STORAGE_DIR),
name="storage_access",
)
# Adiciona o middleware global de erro
# app.middleware("http")(database_error_handler)

View file

@ -8,13 +8,21 @@ from packages.v1.administrativo.models.ato_documento_model import AtoDocumento
from packages.v1.administrativo.schemas.ato_principal_schema import (
AtoPrincipalCodigoAtoSchema,
)
from actions.validations.hash import generate_storage_hash
from actions.validations.hash import (
generate_storage_hash,
generate_temporary_token,
)
# === Recupera configurações e chave AES ===
DB_SETTINGS = get_database_settings()
AES_KEY = getattr(DB_SETTINGS, "aeskey", None)
URL_API = getattr(DB_SETTINGS, "url_api", None)
# === Configuração do token temporário ===
SECRET_KEY = getattr(DB_SETTINGS, "aeskey", None)
ALGORITHM = "HS256"
class ShowAtosRepository:
"""
@ -107,11 +115,14 @@ class ShowAtosRepository:
documentos_list = [
{
"url": (
URL_API
+ "/"
+ generate_storage_hash()
+ "/"
+ d.url.decode("utf-8")
f"{URL_API}/view/{generate_storage_hash()}/{d.url.decode('utf-8')}?token="
+ generate_temporary_token(
generate_storage_hash(),
d.url.decode("utf-8"),
10,
SECRET_KEY,
ALGORITHM,
)
if d.url
else None
),
@ -175,11 +186,14 @@ class ShowAtosRepository:
documentos_vinc_list = [
{
"url": (
URL_API
+ "/"
+ generate_storage_hash()
+ "/"
+ d.url.decode("utf-8")
f"{URL_API}/view/{generate_storage_hash()}/{d.url.decode('utf-8')}?token="
+ generate_temporary_token(
generate_storage_hash(),
d.url.decode("utf-8"),
10,
SECRET_KEY,
ALGORITHM,
)
if d.url
else None
),