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

  1. 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.
  2. 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.
  3. 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.