feat: SSO from GTI Gerenciador and the Gerenciador visual identity
Collaborators logged into GTI Gerenciador open GTI Fiscal without a second password. The panel signs a 60 s JWT (Ed25519; the Hub holds only the public key); the Hub checks signature, iss/aud/exp/nbf, maximum lifetime, nonce against a one-time state cookie set when the flow starts at GET /login (login-CSRF protection) and a single-use jti (sso_used_assertions). Collaborators are provisioned in admin_users with auth_source=GTI_GERENCIADOR and no password; a CHECK constraint makes a passwordless local account or a federated account with a password impossible (migration 0021). Sessions last FEDERATED_SESSION_SECONDS (1 h) and are renewed silently through the panel. The local admin stays as break-glass at /login/local, audited. Logout ends only the Hub session. Every SSO success/rejection (stable reason code), logout and local login is audited with the real client IP, never the token. verify_password now fails closed on a missing hash instead of raising. Visual identity: gti-theme.css is a verbatim copy of the panel's design system (tokens, sidebar, light/dark theme) plus its tema.js, sidebar.js and logo; control-panel.css keeps only Hub components, all colours from the panel tokens. Page structure and features unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -110,7 +110,8 @@ def test_login_has_centered_card_and_explicit_field_labels():
|
||||
|
||||
assert response.status_code == 200
|
||||
assert 'class="login-page"' in response.text
|
||||
assert 'class="login-card"' in response.text
|
||||
# Same card component as the GTI Gerenciador login (gti-theme.css .cartao).
|
||||
assert 'class="cartao login-card"' in response.text
|
||||
assert '<label for="login-username">Usuário</label>' in response.text
|
||||
assert '<label for="login-password">Senha</label>' in response.text
|
||||
|
||||
|
||||
Reference in New Issue
Block a user