---
name: cabal-ghapi-auth-service
description: "ghapi.service: app Flask no host da VM que faz a autenticacao web do LoginSvr (DiGeamAuthWeb/OTP/Token); onde fica, como o LoginSvr fala com ele, e o cert TLS"
metadata:
  type: project
  originSessionId: 153bd067-f5ce-4a37-9378-d46c0afa3789
  modified: 2026-08-17T06:17:13.895Z
---

O `LoginSvr` nao autentica senha sozinho: o passo 1 (`AuthMethodStep1=DiGeamAuthWeb;DiGeamAuthDB`
em `/etc/cabal/LoginSvr_01.ini`, dentro do container) chama por HTTPS um app Flask que roda
**direto no host da VM**, fora de qualquer container: `ghapi.service` (systemd unit), codigo em
`/opt/ghapi-python/` (`app.py`, `db.py`, `email_sender.py`, `Certificates/`).

Endereco: `172.17.0.1:3000` (gateway da bridge docker — e' assim que o container `cabal_main`
alcanca o host). Rotas relevantes no ini:
```
[DiGeamAuthWeb]  Host=172.17.0.1:3000  Path=/game-api/game_login
[DiGeamOTP]      Host=172.17.0.1:3000  Path=/game-api/otp_login
[DiGeamToken]    Host=172.17.0.1:3000  Path1=/game-api/get_auth  Path2=/game-api/login_auth
```
O corpo real que o LoginSvr manda (confirmado nas strings do binario) e'
`user_id=%s&password=%s&user_ip=%s` — a rota `game_login` em `app.py` le exatamente esses
campos (`data.get('user_id')` etc). `db.py` fala com o MSSQL do `sql_main` via `pyodbc` em
`127.0.0.1:1433` (banco `Account`, stored procs `cabal_sp_auth_method_password`,
`cabal_sp_otpinfo_get`, `cabal_tool_userNum_get`); a credencial `sa` fica em texto puro dentro
de `db.py` — nao reproduzo aqui, e rotacionar essa senha continua um item pendente antigo.

Flask roda com `debug=True` (servidor de dev, nao producao — o proprio Werkzeug avisa isso no
log). Nao e' o ideal pra um servico exposto, mas nao foi mexido.

**Certificado TLS:** self-signed, `CN=localhost`, gerado em `/opt/ghapi-python/Certificates/`.
O original (de 3/mai/2025) expirou em 3/mai/2026 e ficou vencido por ~3 meses sem ninguem notar
— **nao chegou a bloquear login nenhum**, porque o cliente HTTP do LoginSvr nao valida a cadeia
nem o hostname do certificado (login funcionou o dia todo com o cert vencido). Renovado em
17/ago/2026: novo cert valido ate 14/ago/2036, com SAN `DNS:localhost, IP:127.0.0.1,
IP:172.17.0.1`, chave privada agora `600` (antes `644`). Backup do cert antigo em
`/root/cert_backup_20260817061544` na VM. Restart via `systemctl restart ghapi.service`
(systemd direto no host, nao supervisor — diferente dos servicos do jogo dentro do container).

Ver [[cabal-server-arquitetura]] pro resto do acesso SSH/Docker.
