Autentica um membro e retorna o JWT
POST/api/auth/login
- Auth
- Public
- Clé d’API:
- Clé d’API non acceptée
- X-CommunityId
X-CommunityIdEnvoyez le X-CommunityId de la communauté où l’opération a lieu.
Endpoint público. O token retornado vale 7 dias.
**Login por comunidade.** A conta é da comunidade: o login procura o perfil pelo par (`X-CommunityId`, e-mail) e confere a senha daquela comunidade. O app resolve o `X-CommunityId` pelo domínio (`POST /api/communities/domain`); não há seletor de comunidade. Sem `X-CommunityId` válido: **400** com `errors[0].param = X-CommunityId`. A mesma pessoa em duas comunidades tem duas senhas independentes (começaram iguais, copiadas na migração).
O token (`pid`, `cid`, `typ`, `ver`) só vale nesta comunidade: com outro `X-CommunityId` a API responde 401. `data.member` traz `memberId` e `communityId` da sessão.
**Verificação e limites.** Toda chamada leva `altcha`, um desafio de `GET /api/auth/challenge` resolvido (o app resolve sem a pessoa ver, ao tocar em Entrar). Ausente, inválido, vencido ou já usado: **422** com `param = altcha`; cada tentativa gasta o seu. Peça o desafio com `POST /api/auth/challenge` e o e-mail: as **tentativas que falharam** por e-mail nesta comunidade (15 minutos; o mesmo para e-mail com ou sem conta) nunca bloqueiam a conta, mas a partir da 6ª deixam o desafio mais pesado (até 10 vezes, cerca de 10 s). Um desafio mais leve do que o e-mail exige no momento da verificação também é **422** (`auth.humanCheckHarder`): peça outro e reenvie. Por IP, o limite é de 100 falhas em 15 minutos: acima, **429** com `Retry-After`. O login certo zera a contagem do e-mail e não conta para a do IP. Integração de servidor não usa login: use uma chave de API.
En-têtes
| Nom | Type | Description |
|---|---|---|
X-CommunityIdobligatoire | string (uuid) | A comunidade em que a pessoa entra (resolvida pelo domínio). |
Corps de la requête application/json
| Nom | Type | Description |
|---|---|---|
emailobligatoire | string (email) | |
passwordobligatoire | string (password) | |
altchaobligatoire | string | O payload do widget ALTCHA (base64 de `{ challenge, solution }`) sobre um desafio de `GET /api/auth/challenge`. Uso único. · max 8192 |
smsConsentfacultatif | object | O texto de serviço ao lado de Entrar. Grava uma vez por comunidade (origem `login`), só se faltar o consentimento na versão atual do texto; nunca impede a entrada. |
smsConsent.servicefacultatif | boolean | |
smsConsent.marketingfacultatif | boolean | |
smsConsent.whatsappfacultatif | object | O consentimento do WhatsApp, com texto próprio (`GET /api/contact-consent/texts` → `whatsapp`), gravado no canal `whatsapp`. |
smsConsent.whatsapp.servicefacultatif | boolean | |
smsConsent.whatsapp.marketingfacultatif | boolean | |
smsConsent.textVersionfacultatif | string | Opcional. A tela mostrou o texto único de SMS e WhatsApp (`GET /api/contact-consent/texts` → `combined.service`): mande a versão dele, e o serviço de cada canal marcado (`service`, `whatsapp.service`) é gravado com essa versão. Um botão só, serviço e marketing juntos: mande a versão de `signup` (`combined-all:AAAA-MM-DD` com os dois canais, `sms-all:` ou `whatsapp-all:` com um só), e cada canal que a comunidade oferece (e que o texto cobre) grava serviço e marketing com essa versão; os booleanos (`service`, `marketing`, `whatsapp`) não são lidos. Só a versão atual é aceita; outra devolve 400 com param = smsConsent. |
Réponses
| Statut | Description |
|---|---|
200 | Login realizado com sucesso. |
400 | Validação, ou `X-CommunityId` ausente ou inválido. |
401 | E-mail ou senha inválidos nesta comunidade. |
422 | Verificação ALTCHA ausente, inválida, vencida, já usada ou (no login) mais fácil do que o e-mail exige agora (`errors[0].param = altcha`). Peça um desafio novo (no login, `POST /api/auth/challenge` com o e-mail), resolva e reenvie. |
429 | Tentativas demais. O header `Retry-After` diz em quantos segundos tentar de novo. |
503 | A API não consegue verificar o ALTCHA agora (chave não configurada em produção). `param = altcha`. |
Exemple curl
curl -X POST "https://api.memberfy.net/api/auth/login" \
-H "X-CommunityId: $COMMUNITY_ID" \
-H "Content-Type: application/json" \
-d '{"email":"[email protected]","password":"Senha@123","altcha":"eyJjaGFsbGVuZ2UiOnsicGFyYW1ldGVycyI6ey4uLn19LCJzb2x1dGlvbiI6ey4uLn19"}'