Quando usar / quando não usar
- Use para autenticar o associado no tenant whitelabel (
X-Progem-ID+X-Device-ID). - Não use em Cobrador, Vendedor, CRM ou Agenda — esses apps compartilham
Acesso Mobile (
/api/v1/mobile/auth/*). - Não use OAuth2 M2M (
/oauth2/token) — ver Integrações. - Admin de usuários (
/app/admin/**) → Plataforma. - Após o token: domínio em Whitelabel.
Comparar: Acesso WL × Mobile × M2M
| Acesso WL (esta página) | Acesso Mobile | M2M | |
|---|---|---|---|
| Apps | Site/app associado | Cobrador, Vendedor, CRM, Agenda | Integrações externas |
| Base | /api/v1/app/auth/* |
/api/v1/mobile/auth/* |
/oauth2/token |
| Tenant | Sempre X-Progem-ID |
Claim após select-tenant | X-Progem-ID + client |
| Senha forgot/reset | /app/password/* |
Não existe | — |
| Guia | Esta página | Acesso Mobile | Integrações |
Headers obrigatórios
| Header | Quando | Notas |
|---|---|---|
X-Progem-ID | Sempre | ID da empresa/tenant |
X-Device-ID | login, register, refresh, logout | Obrigatório; max ~120 chars. Fallback no body de refresh/logout se ausente |
Authorization: Bearer | logout, change password, sessões, /me | Access token do associado |
Content-Type: application/json | POSTs |
Mapa
| Método | Path | Auth |
|---|---|---|
| POST | /api/v1/app/auth/login | Tenant + device (sem Bearer) |
| POST | /api/v1/app/auth/refresh | Refresh token + device |
| POST | /api/v1/app/auth/logout | Bearer + device |
| POST | /api/v1/app/auth/register | Tenant + device |
| POST | /api/v1/app/password/forgot | Bearer client (client_credentials) + tenant |
| POST | /api/v1/app/password/reset | Bearer client (client_credentials) + tenant |
| POST | /api/v1/app/password/change | Bearer do usuário |
| GET | /api/v1/app/sessoes | Bearer |
| DELETE | /api/v1/app/sessoes/{deviceId} | Bearer |
Verify-email / verify-phone (/app/auth/verify-*) existem na API, mas o app whitelabel
atual não os usa na jornada principal — fora do escopo deste guia.
POST /api/v1/app/auth/login
identificador aceita e-mail ou CPF. Sem Bearer. Exige X-Device-ID.
POST {{url_base}}/api/v1/app/auth/login
Content-Type: application/json
X-Progem-ID: {{tenant_id}}
X-Device-ID: {{device_id}}
{ "identificador": "maria@exemplo.com", "senha": "SenhaForte!2025" }
Response 200 — AppAuthResponse
Tokens saem em snake_case JSON: access_token, refresh_token.
{
"access_token": "eyJ…",
"refresh_token": "eyJ…",
"userId": 1001,
"nome": "Maria Silva",
"email": "maria@exemplo.com",
"cpf": "12345678901",
"roles": ["ASSOCIADO"],
"progemLink": { }
}
Status: 200 · 400 tenant/device · 401 credenciais.
POST /api/v1/app/auth/refresh
Resposta em camelCase: accessToken, refreshToken
(diferente do login). Revoga tokens do device antes de emitir o novo par.
POST {{url_base}}/api/v1/app/auth/refresh
Content-Type: application/json
X-Device-ID: {{device_id}}
{ "refreshToken": "eyJ…", "deviceId": "{{device_id}}" }
{ "accessToken": "eyJ…", "refreshToken": "eyJ…" }
POST /api/v1/app/auth/logout
Revoga refresh do device. Resposta 204.
POST {{url_base}}/api/v1/app/auth/logout
Authorization: Bearer {{access_token}}
X-Progem-ID: {{tenant_id}}
X-Device-ID: {{device_id}}
Content-Type: application/json
{ "deviceId": "{{device_id}}" }
POST /api/v1/app/auth/register
Cria UsuarioApp no tenant. 201 com o mesmo formato de auth do login (scopes mínimos no token inicial).
POST {{url_base}}/api/v1/app/auth/register
Content-Type: application/json
X-Progem-ID: {{tenant_id}}
X-Device-ID: {{device_id}}
{
"nome": "Maria Silva",
"email": "maria@exemplo.com",
"senha": "SenhaForte!2025",
"cpf": "12345678901",
"celular": "11999998888",
"dataNascimento": "1990-05-12",
"aceiteTermos": true,
"aceitePrivacidade": true
}
Usuário logado — GET /api/v1/app/me
Perfil do associado após login. Avatar, devices e PUT /me no guia de domínio
Whitelabel · Perfil.
GET {{url_base}}/api/v1/app/me
Authorization: Bearer {{access_token}}
X-Progem-ID: {{tenant_id}}
{
"id": 1001,
"nome": "Maria Silva",
"email": "maria@exemplo.com",
"cpf": "12345678901",
"celular": "11999998888",
"dataNascimento": "1990-05-12",
"emailVerificado": true,
"celularVerificado": false,
"progemLink": { }
}
Atualização oficial: PUT /api/v1/app/me (204). Não confundir com
GET /api/v1/mobile/me (Acesso Mobile).
Senha (forgot / reset / change)
Política de senha (reset, change, /me e admin): 8 a 72 caracteres,
com pelo menos 1 letra maiúscula, 1 minúscula e 1 dígito. Violação: 400 com
code: "PASSWORD_POLICY" e a regra em message.
Tenant: empresaId do token; X-Progem-ID só é usado quando o
token não traz empresa. No whitelabel, o BFF chama forgot/reset com o token
client (OAUTH_CLIENT_ID) — ele e o PROGEM_TENANT_ID precisam ser do mesmo tenant.
POST /api/v1/app/password/forgot
O código (6 dígitos, válido por 10 minutos) é enviado somente por e-mail, para o e-mail
cadastrado do usuário. identifier aceita e-mail, CPF ou celular (com ou sem máscara).
Resposta cega 200: a mesma resposta existindo ou não o usuário, sem e-mail real cadastrado
ou acima do limite de 6 códigos por hora (nesse caso nenhum e-mail sai; não há 429).
Pedir um novo código invalida o anterior.
POST {{url_base}}/api/v1/app/password/forgot
Authorization: Bearer {{client_token}}
Content-Type: application/json
X-Progem-ID: {{tenant_id}}
{ "identifier": "maria@exemplo.com" }
POST /api/v1/app/password/reset
Sucesso 200 e todos os refresh tokens do usuário são revogados (novo login em todos os devices).
Usuário inexistente, código errado, expirado ou já usado: 400
code: "RESET_CODE_INVALID", message: "Código inválido ou expirado.".
Após 5 tentativas erradas o código é invalidado e é preciso pedir outro.
POST {{url_base}}/api/v1/app/password/reset
Authorization: Bearer {{client_token}}
Content-Type: application/json
X-Progem-ID: {{tenant_id}}
{
"identifier": "maria@exemplo.com",
"codigo": "482913",
"novaSenha": "NovaSenhaForte2025"
}
{
"status": 400,
"error": "Bad Request",
"message": "Código inválido ou expirado.",
"code": "RESET_CODE_INVALID"
}
POST /api/v1/app/password/change
Usuário autenticado (o usuário vem do token). email é opcional; se enviado precisa ser o do
próprio usuário (403 caso contrário). Senha atual errada ou nova igual à atual: 400.
POST {{url_base}}/api/v1/app/password/change
Authorization: Bearer {{access_token}}
X-Progem-ID: {{tenant_id}}
Content-Type: application/json
{
"senhaAtual": "SenhaForte2025",
"novaSenha": "NovaSenhaForte2025"
}
Alternativas na API (não usadas pelo whitelabel atual, mesma política de senha):
PATCH /app/me/password, PATCH /app/me/trocar/password.
Sessões
Endpoints existem na API (SessaoController). O web-progem-white-label
não chama esses paths na jornada atual — inventário curto para quem for
expor gestão de dispositivos.
GET /api/v1/app/sessoes
GET {{url_base}}/api/v1/app/sessoes
Authorization: Bearer {{access_token}}
X-Progem-ID: {{tenant_id}}
[
{
"id": 10,
"deviceId": "web-abc",
"userAgent": "Mozilla/…",
"ip": "203.0.113.10",
"expiraEm": "2026-10-01T12:00:00Z"
}
]
DELETE /api/v1/app/sessoes/{deviceId}
Revoga sessões daquele device do próprio usuário. 204.
DELETE {{url_base}}/api/v1/app/sessoes/web-abc
Authorization: Bearer {{access_token}}
X-Progem-ID: {{tenant_id}}
Erros
| Status | Situação |
|---|---|
400 | Empresa ausente, device ausente/inválido, body inválido |
401 | Senha errada, refresh inválido/expirado, não autenticado |
204 | Logout / revogar sessão / (alguns updates) |
201 | Register criado |
200 | Login, refresh, forgot/reset/change (forgot é cego) |
Checklist
- Sempre enviar
X-Progem-ID+X-Device-IDno login/register/refresh/logout. - Tratar diferença de casing: login
access_tokenvs refreshaccessToken. - Guardar refresh por device; após refresh, substituir o par completo.
- Forgot é resposta cega — UX não deve depender de “usuário encontrado”.
- Depois do token: seguir Whitelabel (domínio).
- Cobrador / Vendedor / CRM / Agenda → Acesso Mobile.