Skip to main content

Autenticação

A API do FitLocus utiliza autenticação baseada em tokens JWT (JSON Web Tokens) para proteger seus endpoints. Este guia explica como autenticar suas requisições e gerenciar sessões de usuário.

Visão Geral

O FitLocus implementa um sistema de autenticação robusto que:

  • Utiliza tokens JWT para autenticação stateless
  • Suporta autenticação via email/senha
  • Integra-se com Firebase Authentication para login social
  • Implementa controle de acesso baseado em funções (RBAC)
  • Gerencia sessões com expiração e renovação de tokens

Fluxo de Autenticação

1. Registro de Usuário

Para criar uma nova conta, utilize o endpoint de registro:
POST /users/register
Payload:
{
  "name": "Nome Completo",
  "email": "[email protected]",
  "password": "senha123",
  "userType": "ALUNO", // ou "PERSONAL"
  "requestLocation": "APP", // ou "WEB"
  "confirmed": true
}
Resposta:
{
  "user": {
    "id": 123,
    "name": "Nome Completo",
    "email": "[email protected]",
    "userType": "ALUNO"
  },
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "userId": 123,
  "success": true
}

2. Login com Email e Senha

Para autenticar um usuário existente:
POST /users/login
Payload:
{
  "email": "[email protected]",
  "password": "senha123"
}
Resposta:
{
  "user": {
    "id": 123,
    "name": "Nome Completo",
    "email": "[email protected]",
    "userType": "ALUNO"
  },
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "userId": 123,
  "success": true
}

3. Login com Firebase

Para autenticar usando o Firebase Authentication:
POST /users/firebase-login
Payload:
{
  "firebaseToken": "firebase-token-gerado-pelo-sdk"
}
Resposta:
{
  "user": {
    "id": 123,
    "name": "Nome Completo",
    "email": "[email protected]",
    "userType": "ALUNO"
  },
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "userId": 123,
  "success": true
}

Utilizando o Token JWT

Após autenticar, você receberá um token JWT que deve ser incluído em todas as requisições subsequentes no cabeçalho Authorization:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Exemplo de requisição autenticada:
curl -X GET \
  'http://localhost:8080/api/users/profile' \
  -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...'

Estrutura do Token

O token JWT contém as seguintes claims:
{
  "sub": "123", // ID do usuário
  "name": "Nome Completo",
  "email": "[email protected]",
  "userType": "ALUNO", // ou "PERSONAL"
  "iat": 1619712000, // Timestamp de emissão
  "exp": 1619798400 // Timestamp de expiração
}

Renovação de Token

Os tokens JWT têm validade de 24 horas. Para renovar um token antes que expire, utilize o endpoint:
POST /users/refresh-token
Cabeçalho:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Resposta:
{
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "success": true
}

Logout

Para invalidar um token (logout):
POST /users/logout
Cabeçalho:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Resposta:
{
  "message": "Logout realizado com sucesso",
  "success": true
}

Controle de Acesso

O FitLocus implementa controle de acesso baseado em funções (RBAC) utilizando o campo userType do usuário. Existem dois tipos principais de usuário:
  • ALUNO: Acesso a funcionalidades de execução de treinos e acompanhamento de progresso
  • PERSONAL: Acesso a funcionalidades de criação de treinos e gerenciamento de alunos
Endpoints protegidos verificam o tipo de usuário e aplicam as restrições de acesso apropriadas:
@PreAuthorize("hasRole('PERSONAL')")
@GetMapping("/students")
public ResponseEntity<List<UserDTO>> getStudents() {
    // Implementação...
}

Implementação no Frontend

Armazenamento do Token

No frontend, o token JWT deve ser armazenado no localStorage:
// Após login bem-sucedido
localStorage.setItem('token', response.data.token);
localStorage.setItem('user', JSON.stringify(response.data.user));

Interceptor de Requisições

Configure um interceptor para incluir automaticamente o token em todas as requisições:
// Exemplo com Axios
axios.interceptors.request.use(config => {
  const token = localStorage.getItem('token');
  if (token) {
    config.headers.Authorization = `Bearer ${token}`;
  }
  return config;
});

Verificação de Autenticação

Implemente um hook para verificar se o usuário está autenticado:
export const useAuth = () => {
  const [isAuthenticated, setIsAuthenticated] = useState(false);
  const [user, setUser] = useState(null);
  
  useEffect(() => {
    const token = localStorage.getItem('token');
    const userData = localStorage.getItem('user');
    
    if (token && userData) {
      setIsAuthenticated(true);
      setUser(JSON.parse(userData));
    }
  }, []);
  
  return { isAuthenticated, user };
};

Considerações de Segurança

  1. HTTPS: Todas as comunicações com a API devem ser realizadas através de HTTPS para proteger o token JWT durante a transmissão.
  2. Armazenamento Seguro: No frontend, o token deve ser armazenado de forma segura (localStorage para aplicações web, SecureStorage para aplicações móveis).
  3. Expiração de Token: Os tokens têm validade limitada (24 horas) para mitigar riscos em caso de comprometimento.
  4. Validação de Token: O backend valida a assinatura e a expiração de cada token em todas as requisições.
  5. Proteção contra CSRF: A autenticação baseada em token JWT já oferece proteção contra ataques CSRF.

Troubleshooting

Erros Comuns

CódigoMensagemSolução
401Token inválidoVerifique se o token está sendo enviado corretamente no cabeçalho Authorization
401Token expiradoRenove o token utilizando o endpoint /users/refresh-token
403Acesso negadoVerifique se o usuário tem permissão para acessar o recurso
400Credenciais inválidasVerifique se o email e senha estão corretos

Depuração

Para depurar problemas de autenticação:
  1. Verifique se o token está sendo enviado corretamente no cabeçalho Authorization
  2. Decodifique o token JWT em jwt.io para verificar as claims
  3. Verifique se o token não está expirado
  4. Confirme se o usuário tem as permissões necessárias para acessar o recurso

Recursos Adicionais