# 🔐 API de Login - Guia de Uso

## 📍 Endpoint

```
POST /api/users/login
```

## 📋 Descrição

Endpoint para autenticação de usuários. Retorna um token JWT que deve ser usado para autenticar outras rotas da API.

---

## 📥 Request

### Headers
```
Content-Type: application/json
```

### Body (JSON)
```json
{
  "username": "admin",
  "password": "senha123"
}
```

### Campos Obrigatórios
- `username` (string): Nome de usuário
- `password` (string): Senha do usuário

---

## 📤 Response

### Sucesso (200 OK)

```json
{
  "success": true,
  "message": "Login realizado com sucesso",
  "data": {
    "user": {
      "user_id": 1,
      "username": "admin",
      "email": "admin@microcredito.com",
      "first_name": "Admin",
      "last_name": "Sistema",
      "phone": null,
      "role_id": 1,
      "role_name": "admin",
      "role_description": "Administrador do sistema com acesso total",
      "permissions": {
        "loans": ["create", "read", "update", "delete", "approve"],
        "users": ["create", "read", "update", "delete"],
        "reports": ["read", "export"]
      },
      "is_active": true,
      "last_login": "2025-01-15T10:30:00.000Z",
      "created_at": "2025-01-10T08:00:00.000Z"
    },
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxLCJ1c2VybmFtZSI6ImFkbWluIiwicm9sZSI6ImFkbWluIiwicGVybWlzc2lvbnMiOnsiLmpzb24ifSwiZXhwIjoxNzA3ODk2ODAwfQ.abc123def456",
    "tokenType": "Bearer",
    "expiresIn": "30d"
  },
  "authorization": {
    "header": "Authorization",
    "value": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxLCJ1c2VybmFtZSI6ImFkbWluIiwicm9sZSI6ImFkbWluIiwicGVybWlzc2lvbnMiOnsiLmpzb24ifSwiZXhwIjoxNzA3ODk2ODAwfQ.abc123def456",
    "usage": "Use este valor no header Authorization para autenticar outras rotas"
  }
}
```

### Erro (400 Bad Request)
```json
{
  "success": false,
  "error": "Username e senha são obrigatórios"
}
```

### Erro (401 Unauthorized)
```json
{
  "success": false,
  "error": "Credenciais inválidas"
}
```

---

## 🚀 Como Usar o Token

Após fazer login e copiar o token, você deve usar ele no header `Authorization` de todas as requisições autenticadas:

### Opção 1: Usar o valor completo de `authorization.value`
```
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
```

### Opção 2: Usar apenas o token de `data.token` com prefixo "Bearer "
```
Authorization: Bearer {token_copiado_de_data.token}
```

---

## 📝 Exemplos de Uso

### 1. Login com cURL

```bash
curl -X POST http://localhost:8000/api/users/login \
  -H "Content-Type: application/json" \
  -d '{
    "username": "admin",
    "password": "senha123"
  }'
```

### 2. Copiar Token e Autenticar Outra Rota

```bash
# 1. Fazer login e salvar resposta
RESPONSE=$(curl -X POST http://localhost:8000/api/users/login \
  -H "Content-Type: application/json" \
  -d '{
    "username": "admin",
    "password": "senha123"
  }')

# 2. Extrair token
TOKEN=$(echo $RESPONSE | jq -r '.data.token')

# 3. Usar token para acessar rota autenticada
curl -X GET http://localhost:8000/api/users \
  -H "Authorization: Bearer $TOKEN"
```

### 3. Usando Postman

1. **Fazer Login:**
   - Método: `POST`
   - URL: `http://localhost:8000/api/users/login`
   - Body (raw JSON):
     ```json
     {
       "username": "admin",
       "password": "senha123"
     }
     ```

2. **Copiar Token:**
   - Na resposta, copie o valor de `data.token` ou `authorization.value`

3. **Configurar Authorization:**
   - Vá em "Authorization" tab
   - Type: "Bearer Token"
   - Token: Cole o token copiado (sem o "Bearer " se usar `authorization.value`)

4. **Fazer Requisições Autenticadas:**
   - Agora todas as requisições usarão automaticamente o token

### 4. Usando JavaScript (Fetch)

```javascript
// 1. Fazer login
const loginResponse = await fetch('http://localhost:8000/api/users/login', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    username: 'admin',
    password: 'senha123'
  })
});

const loginData = await loginResponse.json();

// 2. Extrair token
const token = loginData.data.token;

// 3. Usar token para requisições autenticadas
const usersResponse = await fetch('http://localhost:8000/api/users', {
  method: 'GET',
  headers: {
    'Authorization': `Bearer ${token}`,
    'Content-Type': 'application/json'
  }
});

const usersData = await usersResponse.json();
console.log(usersData);
```

### 5. Usando Axios

```javascript
import axios from 'axios';

// 1. Fazer login
const loginResponse = await axios.post('http://localhost:8000/api/users/login', {
  username: 'admin',
  password: 'senha123'
});

// 2. Extrair token
const token = loginResponse.data.data.token;

// 3. Configurar axios para usar token em todas as requisições
axios.defaults.headers.common['Authorization'] = `Bearer ${token}`;

// 4. Agora todas as requisições usarão o token automaticamente
const usersResponse = await axios.get('http://localhost:8000/api/users');
console.log(usersResponse.data);
```

---

## ⚠️ Validações

1. **Username e senha obrigatórios:** Ambos os campos devem ser fornecidos
2. **Usuário deve existir:** O username deve existir no banco de dados
3. **Usuário deve estar ativo:** O usuário deve ter `is_active = true`
4. **Senha deve estar correta:** A senha fornecida deve corresponder ao hash armazenado

---

## 🔒 Segurança

- O token expira após **30 dias** (configurável via `JWT_EXPIRE`)
- O token é armazenado no header `Authorization` da resposta
- **NUNCA** compartilhe o token publicamente
- **NUNCA** commite tokens no código
- Use HTTPS em produção

---

## 📊 Informações Adicionais

### Token Inclui
- `user_id`: ID do usuário
- `username`: Nome de usuário
- `role`: Role do usuário
- `permissions`: Permissões do usuário

### Validade do Token
- Padrão: **30 dias** (30d)
- Configurável via variável de ambiente `JWT_EXPIRE`
- Formato: número + letra (ex: `30d`, `1h`, `7d`, `24h`)

---

## 🧪 Teste Rápido

```bash
# Login
curl -X POST http://localhost:8000/api/users/login \
  -H "Content-Type: application/json" \
  -d '{"username":"admin","password":"senha123"}'

# Copie o token da resposta e use aqui:
curl -X GET http://localhost:8000/api/users \
  -H "Authorization: Bearer SEU_TOKEN_AQUI"
```

---

## ✅ Checklist de Uso

- [ ] Fazer requisição POST para `/api/users/login` com username e password
- [ ] Verificar se recebeu `success: true` na resposta
- [ ] Copiar o token de `data.token` ou `authorization.value`
- [ ] Adicionar header `Authorization: Bearer {token}` em requisições autenticadas
- [ ] Verificar se as rotas autenticadas funcionam corretamente

---

**Endpoint pronto para uso! 🚀**


