Uma API, ou Application Programming Interface, é uma interface que permite que diferentes sistemas e aplicativos se comuniquem de forma padronizada e segura. Em outras palavras, uma API é um conjunto de protocolos e padrões que especificam como diferentes sistemas podem se comunicar uns com os outros.
As APIs são usadas para acessar recursos e dados de outras aplicações e sistemas de forma fácil e eficiente. Por exemplo, uma aplicação de previsão do tempo pode utilizar a API de uma empresa de dados meteorológicos para obter informações atualizadas e precisas sobre condições climáticas em determinada região.
Este código fonte faz parte da palestra API's Eficientes. O código é livre e pode ser usado por toda a comunidade referenciando o autor sob licença MIT.
Esta é uma API Flask que fornece funcionalidades básicas de gerenciamento de usuários com autenticação usando JSON Web Tokens (JWT).
Endpoint: /api/v1/login
Método: POST
Este endpoint é usado para autenticação do usuário. Ele espera um payload JSON com o email do usuário. Se o usuário existir no banco de dados, um token de autenticação é gerado e retornado.
{
"email": "usuario@example.com"
}{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}Endpoint: /api/v1/users
Método: POST
Autenticação: Necessária (token JWT no cabeçalho da requisição)
Este endpoint é usado para criar um novo usuário. Ele espera um payload JSON com o nome e email do usuário. O usuário é então adicionado ao banco de dados.
{
"name": "Fulano de Tal",
"email": "fulano@example.com"
}{
"user": {
"id": 1,
"name": "Fulano de Tal",
"email": "fulano@example.com"
}
}Endpoint: /api/v1/users
Método: GET
Autenticação: Necessária (token JWT no cabeçalho da requisição)
Este endpoint recupera todos os usuários do banco de dados.
{
"users": [
{
"id": 1,
"name": "Fulano de Tal",
"email": "fulano@example.com"
},
{
"id": 2,
"name": "Beltrano da Silva",
"email": "beltrano@example.com"
}
]
}Endpoint: /api/v1/users/<user_id>
Método: GET
Autenticação: Necessária (token JWT no cabeçalho da requisição)
Este endpoint recupera um usuário pelo seu ID do banco de dados.
{
"user": {
"id": 1,
"name": "Fulano de Tal",
"email": "fulano@example.com"
}
}Endpoint: /api/v1/users/<user_id>
Método: PUT
Autenticação: Necessária (token JWT no cabeçalho da requisição)
Este endpoint é usado para atualizar as informações de um usuário. Ele espera um payload JSON com o novo nome e/ou email para o usuário identificado pelo user_id.
{
"name": "Novo Nome",
"email": "novoemail@example.com"
}{
"user": {
"id": 1,
"name": "Novo Nome",
"email": "novoemail@example.com"
}
}Endpoint: /api/v1/users/<user_id>
Método: DELETE Autenticação: Necessária (token JWT no cabeçalho da requisição)
Este endpoint exclui um usuário do banco de dados com base no seu ID.
{
"result": "Usuário excluído"
}Para acessar os endpoints protegidos (/api/v1/users, /api/v1/users/<user_id>), você precisa incluir um cabeçalho Authorization na requisição com um token JWT válido. O token pode ser obtido chamando o endpoint de login (/api/v1/login) com o email de um usuário.
Exemplo:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Uma API RESTful é uma abordagem popular para a construção de serviços web. Ela segue princípios de arquitetura que facilitam a comunicação entre cliente e servidor. Algumas melhores práticas para o desenvolvimento de APIs RESTful incluem:
-
Padrões de URL: Utilize URLs descritivas e intuitivas que representem os recursos manipulados pela API. Evite informações sensíveis nas URLs.
-
Verbos HTTP: Utilize os verbos HTTP adequados (GET, POST, PUT, DELETE) para operações de leitura, criação, atualização e exclusão de recursos, respectivamente.
-
Respostas HTTP: Retorne códigos de status HTTP apropriados para indicar o sucesso ou falha de uma requisição. Utilize os códigos de status corretos para diferentes situações.
A segurança em APIs é fundamental para proteger os recursos e os dados transmitidos entre cliente e servidor. Existem diversas estratégias de autenticação e autorização disponíveis:
-
Autenticação Básica: Consiste no envio de credenciais (usuário e senha) na requisição HTTP. É uma forma simples de autenticação, porém menos segura, pois as credenciais são enviadas sem criptografia.
-
API Key: Uma API Key é um token único que identifica um cliente ou aplicação. É geralmente incluída no cabeçalho ou nos parâmetros da requisição para autenticar e controlar o acesso à API.
-
JWT (JSON Web Token): JWT é um formato de token seguro que pode ser utilizado para autenticação e troca de informações entre cliente e servidor. Ele é assinado digitalmente e pode conter informações como identidade do usuário e permissões.
-
OAuth 2.0: O OAuth 2.0 é um protocolo de autorização amplamente utilizado. Ele permite que usuários autorizem o acesso a recursos protegidos sem compartilhar suas credenciais com a aplicação solicitante. É comumente utilizado para integração com serviços de terceiros.
Além das estratégias de autenticação, existem outras boas práticas em segurança de APIs que podem ser implementadas:
-
Rate Limit: O Rate Limit impõe limites no número de requisições que um cliente pode fazer dentro de um determinado período de tempo. Isso ajuda a evitar ataques de negação de serviço e protege a API contra uso excessivo.
-
Logs: Registre eventos e atividades relevantes da API em logs. Isso auxilia na detecção de comportamentos suspeitos, investigação de incidentes e monitoramento da segurança.
-
Validação de Entrada: Realize validação rigorosa nos dados de entrada recebidos pela API. Isso ajuda a prevenir ataques de injeção, como SQL injection e XSS, e garante a integridade dos dados manipulados.
O Swagger UI é uma ferramenta para documentar e testar APIs de forma interativa. Ele fornece uma interface amigável onde os desenvolvedores podem explorar e interagir com os endpoints da API. O Swagger UI exibe detalhes sobre os endpoints, parâmetros, códigos de status e exemplos de requisições e respostas. Isso facilita o entendimento e o uso correto da API pelos consumidores.
python -m venv .venv
.venv/Scripts/Activate.ps1
pip install -r requirements.txt
python run.py
No seu navegador acesse a URL http://127.0.0.1:5000 ou use um API Client, recomendo o ThunderClient presente no visual studio code.
Execute o login com o json:
{
"email":"tacito.silva@fieb.org"
}
# Cria o venv
python -m venv .venv
# Instalar os pacotes na venv
pip install -r requirements.txt
# Exporta os pacotes locais em um arquivo TXT
pip freeze --local > requirements.txt
# Executar a API
python run.py