POST /api/login
Autentica um utilizador e retorna um token JWT.
Endpoint
POST /api/login
Headers
| Header | Valor | Obrigatorio |
|---|---|---|
| Content-Type | application/json | Sim |
Corpo da requisicao
{
"email": "string",
"password": "string"
}
| Campo | Tipo | Obrigatorio | Descricao |
|---|---|---|---|
| string | Sim | Endereco de email do utilizador | |
| password | string | Sim | Palavra-passe |
Resposta de sucesso
Código: 200 OK
{
"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9...",
"refresh_token": "d1f2a3b4c5e6f7g8h9i0j1k2l3m4n5o6",
"user": {
"id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"email": "agent@example.org",
"roles": ["ROLE_USER"],
"roleLabel": "Spécialiste Transferts Monétaires",
"nom": "Exemple",
"prenom": "Agent",
"totpEnabled": false,
"passwordExpired": false,
"mustChangePassword": false,
"passwordExpiresIn": 75,
"passwordWarning": null,
"region": null
}
}
| Campo | Tipo | Descrição |
|---|---|---|
| token | string | Token de acesso JWT (duração: 1 hora) |
| refresh_token | string | Token de renovação (duração: 30 dias, renovado em cada renovação) |
| user | object | Utilizador autenticado; as suas permissões leem-se depois com GET /api/me/permissions |
Além do corpo, a resposta define três cookies: BEARER (JWT, httpOnly), REFRESH_TOKEN (httpOnly) e XSRF-TOKEN (legível pelo navegador). Um cliente que se autentica por cookie deve copiar o valor de XSRF-TOKEN para o cabeçalho X-CSRF-TOKEN de cada pedido POST, PUT, PATCH ou DELETE; um cliente que envia o cabeçalho Authorization: Bearer sem cookies não é afetado.
Autenticação de dois fatores (2FA)
Se o utilizador ativou a 2FA, o login ainda não entrega um token utilizável:
{
"requires2FA": true,
"message": "Verification 2FA requise",
"user": { "id": "…", "email": "agent@example.org", "totpEnabled": true }
}
O cliente envia depois o código de 6 dígitos para POST /api/2fa/verify, que entrega o JWT e o refresh token. As outras rotas 2FA (/api/2fa/setup, enable, disable, status, login-history) gerem a ativação a partir do perfil.
Respostas de erro
401 Unauthorized - Credenciais invalidas
{
"code": 401,
"message": "Invalid credentials."
}
400 Bad Request - Dados em falta
{
"code": 400,
"message": "The key \"email\" must be provided."
}
403 Forbidden - Conta desativada
{
"code": 403,
"message": "Account is disabled."
}
Exemplos
cURL
curl -X POST https://sig.example.com/api/login \
-H "Content-Type: application/json" \
-d '{
"email": "admin@pch-sig.sn",
"password": "<MOT_DE_PASSE_ADMIN>"
}'
JavaScript
const login = async (email, password) => {
const response = await fetch('https://sig.example.com/api/login', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ email, password })
});
if (!response.ok) {
throw new Error('Authentication failed');
}
const data = await response.json();
// Armazenar o token
localStorage.setItem('token', data.token);
localStorage.setItem('refresh_token', data.refresh_token);
return data;
};
Python
import requests
response = requests.post(
'https://sig.example.com/api/login',
json={
'email': 'admin@pch-sig.sn',
'password': '<MOT_DE_PASSE_ADMIN>'
}
)
if response.status_code == 200:
data = response.json()
token = data['token']
print(f"Conectado como {data['user']['email']}")
else:
print(f"Erro: {response.json()['message']}")
Utilizacao do token
Apos obter o token, inclua-o no header Authorization para as requisicoes seguintes:
curl https://sig.example.com/api/menages \
-H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9..."
Estrutura do token JWT
O token contem as seguintes informacoes (payload descodificado):
{
"iat": 1705312345,
"exp": 1705315945,
"roles": ["ROLE_ADMIN"],
"email": "admin@pch-sig.sn",
"user_id": 1
}
| Campo | Descricao |
|---|---|
| iat | Timestamp de criacao |
| exp | Timestamp de expiracao |
| roles | Funcoes do utilizador |
| Email do utilizador | |
| user_id | ID do utilizador |
Notas
- O token expira apos 1 hora
- Utilize o
refresh_tokenpara obter um novo token sem reinserir as credenciais - Nunca armazene o token num local nao seguro
- Em producao, utilize sempre HTTPS