🚀 B24Workflows OAuth Server v2.3

Documentació Tècnica Completa - Sistema OAuth Multiusuari

Versió: 2.3.0 | Data: 6 de setembre de 2025

Estat: Completament operatiu i verificat amb fix de validació UTC

📖 Què és i què fa

B24Workflows OAuth Server v2.3 és un servidor OAuth multiusuari que permet a aplicacions externes accedir de forma segura a la API de Bitrix24 mitjançant tokens OAuth individuals per cada usuari.

🎯 Objectiu Principal

Facilitar l'accés programàtic a Bitrix24 des d'aplicacions externes (Python, PHP, JavaScript, etc.) sense haver de gestionar manualment el procés complex d'OAuth per cada usuari.

🔥 Característiques Clau v2.3

✅ Validació UTC Robusta

Verificació d'expiració de tokens amb comparació UTC independent del timezone local.

🗑️ Cleanup Automàtic

Sistema de neteja de tokens expirats amb informes detallats i programació automàtica.

🌍 Interfície Bilingüe

Missatges i documentació en català i espanyol per als usuaris d'Evenia.

📊 Dashboard Integrat

Monitorització visual amb Streamlit i mètriques en temps real.

🏗️ Arquitectura del Sistema

[Aplicació Externa] ↓ [Traefik 2.11.24 HTTPS] ↓ [B24Workflows OAuth Server v2.3] ↓ [SQLite Database] ←→ [Bitrix24 OAuth API] ↓ [Streamlit Dashboard]

📦 Components Tècnics

  • Frontend: FastAPI + Streamlit dashboard
  • Base de Dades: SQLite amb taules user_tokens i tokens
  • Proxy Invers: Traefik 2.11.24 amb certificats wildcard HTTPS
  • Container: Python 3.11 slim amb usuari non-root
  • Ports: 8000 (FastAPI) + 8501 (Streamlit) via Traefik

🔄 Flux de Funcionament OAuth

1. Sol·licitud Inicial

POST /api/v2/request-user-token { "user_email": "usuari@evenia.ad", "domain": "bitrix.evenia.ad" }

2. Verificació de Token Existent

  • Si existeix token vàlid: Retorna {"status": "token_exists"}
  • Si token expirat o inexistent: Retorna {"status": "authorization_needed", "authorization_url": "..."}

3. Procés d'Autorització (Si cal)

GET /login/user/{user_email}?domain=bitrix.evenia.ad # ↓ Redirect automàtic a Bitrix24 OAuth

4. Recuperació de Token

GET /api/v2/get-user-token/{user_email}?domain=bitrix.evenia.ad # ↓ Retorna access_token vàlid per fer crides a Bitrix24

🌐 Endpoints Disponibles

🔑 API OAuth v2 (Principals)

POST /api/v2/request-user-token

Sol·licitar token OAuth per un usuari específic

GET /api/v2/get-user-token/{user_email}

Recuperar token vàlid (no expirat) per un usuari

🏥 Monitorització i Status

GET /health

Health check del servei

GET /status

Status detallat del sistema

🗑️ Sistema de Cleanup v2.3

GET /api/v2/admin/tokens-analysis

Anàlisi completa de tokens (requereix admin_key)

POST /api/v2/admin/cleanup-tokens

Cleanup manual de tokens expirats (requereix admin_key)

✅ Sistema de Validació UTC v2.3

El sistema implementa una validació robusta d'expiració UTC que resol els problemes de tokens expirats que es retornaven com a vàlids:

🔧 Millores Implementades

  • Parsing robust de dates: Suporta formats amb i sense "T", amb i sense microsegons
  • Comparació UTC: Independent del timezone local del servidor
  • Missatges bilingües: Errors d'expiració en català i espanyol
  • Logging informatiu: Registra tokens vàlids i expirats per debugging

🎯 Flux Correcte

  1. Usuari demana tokenrequest_user_token()
  2. Sistema busca tokenget_valid_user_token()
  3. Si troba token:
    • ✅ Verifica si és vàlid (no expirat) amb UTC
    • Si és vàlid → Retorna "token_exists"
    • ❌ Si és expirat → Error 401 + genera nova autorització
  4. Si no troba token → Genera nova autorització

🗑️ Sistema de Cleanup v2.3

Sistema automàtic de neteja de tokens expirats amb anàlisi matemàtic i informes detallats.

📊 Anàlisi per 250 Usuaris

  • Ús realista: ~156 tokens nous/setmana, ~670 tokens/mes
  • Sense cleanup: 8,036 tokens/any, creixement BD de 4MB
  • Impacte cleanup: ~156 tokens expirats/setmana a eliminar

🔧 Components del Sistema

  • Script CLI: cleanup_expired_tokens.py amb flags --dry-run, --report, --json
  • Endpoints API: Cleanup manual i anàlisi via REST API
  • Automatització Docker: Cron job setmanal (diumenge 02:00)

🛠️ Exemples d'Integració

Exemple Python

import requests # Configuració BASE_URL = "https://b24oauth.evenia.dev" USER_EMAIL = "usuari@evenia.ad" DOMAIN = "bitrix.evenia.ad" # Sol·licitar token response = requests.post( f"{BASE_URL}/api/v2/request-user-token", headers={"Content-Type": "application/json"}, json={"user_email": USER_EMAIL, "domain": DOMAIN}, verify=False ) result = response.json() if result["status"] == "token_exists": # Obtenir el token token_response = requests.get( f"{BASE_URL}/api/v2/get-user-token/{USER_EMAIL}?domain={DOMAIN}", verify=False ) if token_response.status_code == 200: token_data = token_response.json() access_token = token_data["access_token"] # Usar el token amb Bitrix24 bitrix_response = requests.get( f"https://{DOMAIN}/rest/user.current", params={"auth": access_token} ) print("Dades usuari:", bitrix_response.json())

Exemple cURL

# Sol·licitar token curl -k -X POST "https://b24oauth.evenia.dev/api/v2/request-user-token" \ -H "Content-Type: application/json" \ -d "{\"user_email\": \"usuari@evenia.ad\", \"domain\": \"bitrix.evenia.ad\"}" # Obtenir token existent curl -k "https://b24oauth.evenia.dev/api/v2/get-user-token/usuari@evenia.ad?domain=bitrix.evenia.ad"

🧪 Comandes de Verificació Completes

Health Checks

# Health check bàsic curl -k -s "https://b24oauth.evenia.dev/health" | python -m json.tool # Status detallat curl -k -s "https://b24oauth.evenia.dev/status" | python -m json.tool # Debug de base de dades curl -k -s "https://b24oauth.evenia.dev/api/v2/database-debug" | python -m json.tool

Sistema de Cleanup

# Anàlisi de tokens (sense eliminar) curl -k -s "https://b24oauth.evenia.dev/api/v2/admin/tokens-analysis?admin_key=admin_cleanup_2025" | python -m json.tool # Dry run del cleanup (simulació) curl -k -X POST -s "https://b24oauth.evenia.dev/api/v2/admin/cleanup-tokens?admin_key=admin_cleanup_2025&dry_run=true" | python -m json.tool # Cleanup real (eliminar tokens expirats) curl -k -X POST -s "https://b24oauth.evenia.dev/api/v2/admin/cleanup-tokens?admin_key=admin_cleanup_2025&dry_run=false" | python -m json.tool

OAuth i Tokens

# Sol·licitar token (amb fitxer JSON per evitar problemes PowerShell) # Crear test_request.json amb: {"user_email": "omolist@evenia.ad", "domain": "bitrix.evenia.ad"} curl -k -X POST "https://b24oauth.evenia.dev/api/v2/request-user-token" -H "Content-Type: application/json" -d @test_request.json # Obtenir token existent curl -k -s "https://b24oauth.evenia.dev/api/v2/get-user-token/omolist@evenia.ad?domain=bitrix.evenia.ad" | python -m json.tool

Test de Token Expirat

# Crear token expirat per proves docker exec b24workflows-local python3 -c " import sqlite3; from datetime import datetime, timedelta conn = sqlite3.connect('/app/data/b24workflows_v2.db') cursor = conn.cursor() cursor.execute('DELETE FROM user_tokens WHERE user_email = ?', ('test_expirat@evenia.ad',)) expired_time = datetime.utcnow() - timedelta(hours=3) expired_str = expired_time.strftime('%Y-%m-%d %H:%M:%S.%f') cursor.execute('INSERT INTO user_tokens (user_email, domain, access_token, refresh_token, expires_at, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?)', ('test_expirat@evenia.ad', 'bitrix.evenia.ad', 'TOKEN_EXPIRAT_TEST', 'REFRESH_EXPIRAT', expired_str, expired_str, expired_str)) conn.commit(); print(f'Token expirat creat: {expired_str}'); conn.close()" # Provar token expirat (ha de donar error 401) curl -k -s "https://b24oauth.evenia.dev/api/v2/get-user-token/test_expirat@evenia.ad?domain=bitrix.evenia.ad" | python -m json.tool

📋 Configuració Traefik Crítica

🔴 Labels Traefik Essencials

Aquests labels són obligatoris per al funcionament correcte del sistema:

# OBLIGATORI: Habilita routing automàtic Traefik - "traefik.enable=true" # ROUTING PRINCIPAL: Host específic per accés extern - "traefik.http.routers.b24workflows-api.rule=Host(`b24oauth.evenia.dev`)" # SEGURETAT: Només HTTPS, no HTTP - "traefik.http.routers.b24workflows-api.entrypoints=websecure" - "traefik.http.routers.b24workflows-api.tls=true" # PRIORITATS: Evita conflictes entre serveis del mateix contenidor - "traefik.http.routers.b24workflows-api.priority=100" - "traefik.http.routers.b24workflows-streamlit.priority=200" # SERVEIS EXPLÍCITS: Evita confusió automàtica Traefik - "traefik.http.routers.b24workflows-api.service=b24workflows-api-service" - "traefik.http.services.b24workflows-api-service.loadbalancer.server.port=8000" # XARXA: CRUCIAL per comunicació Traefik ↔ Contenidor - "traefik.docker.network=traefik-public"

🐳 Desplegament Docker

Requeriments del Sistema

  • Docker Engine: v20.10+ o superior
  • Docker Compose: v2.0+ o superior
  • Traefik: v2.11.24 (exactament aquesta versió)
  • Certificats HTTPS: Wildcard *.evenia.dev
  • DNS: Resolució b24oauth.evenia.dev → IP servidor
  • Ports: 80, 443 disponibles per Traefik

Passos de Desplegament

# 1. Crear xarxa compartida Traefik docker network create traefik-public # 2. Desplegar Traefik docker-compose -f docker-compose-traefik.yml up -d # 3. Construir imatge amb sqlite3 fix docker build -t b24workflows:local . # 4. Desplegar aplicació docker-compose -f docker-compose-b24workflows.yml up -d # 5. Verificació post-desplegament curl -k https://b24oauth.evenia.dev/health curl -k https://b24oauth.evenia.dev/docs

⚡ Punts Crítics d'Implementació

🔴 SQLite3 Fix + Validació UTC

El servidor utilitza sqlite3 directe amb validació robusta UTC per verificar l'expiració de tokens. Aquest fix és obligatori per al funcionament correcte.

🔴 Certificats Wildcard

Utilitza certificats wildcard del servidor de producció per evitar conflictes al navegador.

🔴 Configuració Traefik

Les línies de prioritat i serveis explícits són essencials per evitar conflictes de routing.

✅ Estat v2.3

Sistema completament operatiu i verificat amb validació de tokens robusta i cleanup automàtic.

🏆 B24Workflows OAuth Server v2.3

Completament operatiu i documentat

✅ Sistema amb Validació UTC: Tokens expirats detectats correctament

🗑️ Cleanup Automàtic: Neteja programada i manual disponible

🌍 Interfície Bilingüe: Suport complet CA/ES

📊 Dashboard Integrat: Monitorització Streamlit operativa

Generat amb Memex | © 2025 Evenia

Data de documentació: 6 de setembre de 2025 | Versió: 2.3.0