Pedidos
Explicação do Código em Python: Requisições HTTP com CSRF e Autenticação
Este código em Python utiliza a biblioteca requests
para interagir com uma API protegida por CSRF e autenticação baseada em token. O fluxo do código envolve obter um token CSRF, fazer login e realizar requisições autenticadas a um endpoint da API.
Fluxo Geral do Código
- Renovação do Token CSRF: Antes de qualquer outra ação, o código renova o token CSRF necessário para proteger as requisições POST.
- Login e Obtenção de Token de Acesso: Após obter o token CSRF, o código realiza login com um e-mail e senha, recebendo um token de acesso que será usado para autenticação em chamadas subsequentes.
- Requisição GET Autenticada: Utilizando o token de acesso, o código faz uma requisição GET para o endpoint de pedidos e trata possíveis erros.
Configurações
O início do código define algumas variáveis importantes, como os endpoints da API e as credenciais de login:
API_CSRF_ENDPOINT = 'https://cafe.guiverso.org/sanctum/csrf-cookie'
API_LOGIN_ENDPOINT = 'https://cafe.guiverso.org/api/v1/login'
USER_EMAIL = "user@mail"
USER_PASSWORD = "password"
API_ENDPOINT_URL = 'https://cafe.guiverso.org/api/v1/pedidos_api'
MAX_RETRIES = 3
RETRY_DELAY = 2 # segundos
Funções
1. renew_csrf_token()
Esta função é responsável por renovar o token CSRF. Ela tenta fazer uma requisição GET ao endpoint CSRF várias vezes, até obter uma resposta bem-sucedida:
def renew_csrf_token():
for attempt in range(MAX_RETRIES):
try:
response = requests.get(API_CSRF_ENDPOINT)
if response.status_code == 204:
print("CSRF token successfully renewed!")
return response.cookies
else:
print(f"Failed to renew CSRF token. Status code: {response.status_code}")
except requests.exceptions.RequestException as e:
print(f"Error renewing CSRF token: {e}")
time.sleep(RETRY_DELAY)
exit("Max retries exceeded for renewing CSRF token.")
2. perform_login(email, password, cookies)
Esta função realiza o login do usuário, enviando o e-mail e a senha. Se o login for bem-sucedido, ela retorna o token de acesso:
def perform_login(email, password, cookies):
login_payload = {"email": email, "password": password}
headers = {"Content-Type": "application/json"}
for attempt in range(MAX_RETRIES):
try:
response = requests.post(API_LOGIN_ENDPOINT, json=login_payload, headers=headers, cookies=cookies)
if response.status_code == 200:
access_token = response.json().get('token')
print("Login successful. Access Token:", access_token)
return access_token
else:
print(f"Login failed. Status code: {response.status_code}")
except requests.exceptions.RequestException as e:
print(f"Error making POST request for login: {e}")
time.sleep(RETRY_DELAY)
return None
3. perform_get_request(url, headers)
Esta função realiza uma requisição GET ao endpoint especificado usando o token de acesso:
def perform_get_request(url, headers):
for attempt in range(MAX_RETRIES):
try:
response = requests.get(url, headers=headers)
if response.status_code == 200:
print(response.text)
return response.text
else:
handle_request_failure(response)
except requests.exceptions.RequestException as e:
print(f"Error making GET request: {e}")
time.sleep(RETRY_DELAY)
4. handle_request_failure(response)
Esta função trata falhas nas requisições, exibindo mensagens de erro relevantes:
def handle_request_failure(response):
try:
error_message = response.json().get('error', '')
if error_message:
print(f"Request failed. Status code: {response.status_code}. Error message: {error_message}")
else:
print(f"Request failed. Status code: {response.status_code}")
except ValueError:
print(f"Request failed. Status code: {response.status_code}. Details: {response.text}")
Fluxo Principal
Por fim, o fluxo principal do código chama as funções na ordem correta:
csrf_cookies = renew_csrf_token()
access_token = perform_login(USER_EMAIL, USER_PASSWORD, csrf_cookies)
if access_token:
request_headers = {"Authorization": f"Bearer {access_token}"}
perform_get_request(API_ENDPOINT_URL, request_headers)
else:
print("Failed to obtain access token.")
Conclusão
Esse código fornece uma maneira estruturada de interagir com uma API que exige proteção CSRF e autenticação, tratando possíveis falhas e permitindo múltiplas tentativas em caso de erro.