Ir para conteúdo principal

Autenticação API

Aprenda como autenticar suas requisições na API Atys usando Bearer Token (OAuth 2.0).

Importante: Todas as requisições à API Atys requerem autenticação via Bearer Token no header Authorization.

Como Funciona

A autenticação na API Atys segue o padrão OAuth 2.0 com fluxo de credenciais de senha (Resource Owner Password Credentials Grant). O processo é simples:

1. Obter Credenciais

Use o email e senha do usuário API cadastrado na plataforma Atys.

2. Fazer Login

Envie as credenciais para o endpoint de autenticação e receba o access_token.

3. Usar Token

Inclua o token no header Authorization de todas as requisições.

Obter access_token

Para obter o token de autenticação, faça uma requisição POST para o endpoint https://api.atys.pro/api/oauth/token com suas credenciais.

POST

https://api.atys.pro/api/oauth/token

Autenticar e obter access_token

Parâmetros do Body (JSON)

Parâmetro Tipo Obrigatório Descrição Valor
email string ✅ Sim Email do usuário API joao@exemplo.com
password string ✅ Sim Senha do usuário API senha123
grant_type string ✅ Sim Tipo de grant (password) password

Exemplos de Código

JavaScript (Fetch API)
const response = await fetch('https://api.atys.pro/api/oauth/token', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Accept': 'application/json'
  },
  body: JSON.stringify({
    email: 'seu-email@exemplo.com',
    password: 'sua-senha-segura',
    grant_type: 'password'
  })
});

const data = await response.json();
console.log(data.access_token);
Python (Requests)
import requests

response = requests.post(
    'https://api.atys.pro/api/oauth/token',
    headers={
        'Content-Type': 'application/json',
        'Accept': 'application/json'
    },
    json={
        'email': 'seu-email@exemplo.com',
        'password': 'sua-senha-segura',
        'grant_type': 'password'
    }
)

data = response.json()
print(data['access_token'])
PHP (cURL)
<?php

$ch = curl_init('https://api.atys.pro/api/oauth/token');

curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type: application/json',
    'Accept: application/json'
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
    'email' => 'seu-email@exemplo.com',
    'password' => 'sua-senha-segura',
    'grant_type' => 'password'
]));

$response = curl_exec($ch);
curl_close($ch);

$data = json_decode($response, true);
echo $data['access_token'];

?>
PHP (Guzzle HTTP Client)
<?php
// composer require guzzlehttp/guzzle

use GuzzleHttp\Client;

$client = new Client();

$response = $client->post('https://api.atys.pro/api/oauth/token', [
    'headers' => [
        'Content-Type' => 'application/json',
        'Accept' => 'application/json'
    ],
    'json' => [
        'email' => 'seu-email@exemplo.com',
        'password' => 'sua-senha-segura',
        'grant_type' => 'password'
    ]
]);

$data = json_decode($response->getBody(), true);
echo $data['access_token'];

?>
Go (net/http)
package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "io"
    "net/http"
)

func main() {
    payload := map[string]string{
        "email":      "seu-email@exemplo.com",
        "password":   "sua-senha-segura",
        "grant_type": "password",
    }
    
    jsonData, _ := json.Marshal(payload)
    
    resp, err := http.Post(
        "https://api.atys.pro/api/oauth/token",
        "application/json",
        bytes.NewBuffer(jsonData),
    )
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()
    
    body, _ := io.ReadAll(resp.Body)
    
    var result map[string]interface{}
    json.Unmarshal(body, &result)
    
    fmt.Println(result["access_token"])
}
cURL (Terminal)
curl -X POST https://api.atys.pro/api/oauth/token \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{
    "email": "seu-email@exemplo.com",
    "password": "sua-senha-segura",
    "grant_type": "password"
  }'

Resposta de Sucesso (200 OK)

JSON Response
{
  "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9...",
  "token_type": "Bearer",
  "user_data": {
    "id": 123,
    "name": "João Silva",
    "email": "joao@exemplo.com",
    "company_id": 45,
    // ... demais campos do usuário
  }
}

Usando o access_token

Após obter o token, inclua-o no header Authorization de todas as requisições subsequentes:

Header Authorization
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9...

Exemplo de Requisição Autenticada

const response = await fetch('https://api.atys.pro/api/contacts', {
  method: 'GET',
  headers: {
    'Authorization': 'Bearer SEU_ACCESS_TOKEN',
    'Accept': 'application/json'
  }
});

const data = await response.json();
import requests

response = requests.get(
    'https://api.atys.pro/api/contacts',
    headers={
        'Authorization': 'Bearer SEU_ACCESS_TOKEN',
        'Accept': 'application/json'
    }
)

data = response.json()
<?php

$ch = curl_init('https://api.atys.pro/api/contacts');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: Bearer SEU_ACCESS_TOKEN',
    'Accept: application/json'
]);

$response = curl_exec($ch);
$data = json_decode($response, true);
curl_close($ch);

?>
<?php

use GuzzleHttp\Client;

$client = new Client();

$response = $client->get('https://api.atys.pro/api/contacts', [
    'headers' => [
        'Authorization' => 'Bearer SEU_ACCESS_TOKEN',
        'Accept' => 'application/json'
    ]
]);

$data = json_decode($response->getBody(), true);

?>
package main

import (
    "encoding/json"
    "io"
    "net/http"
)

func main() {
    req, _ := http.NewRequest(
        "GET",
        "https://api.atys.pro/api/contacts",
        nil,
    )
    
    req.Header.Set("Authorization", "Bearer SEU_ACCESS_TOKEN")
    req.Header.Set("Accept", "application/json")
    
    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()
    
    body, _ := io.ReadAll(resp.Body)
    
    var result map[string]interface{}
    json.Unmarshal(body, &result)
}
curl -X GET https://api.atys.pro/api/contacts \
  -H "Authorization: Bearer SEU_ACCESS_TOKEN" \
  -H "Accept: application/json"

Renovação do Token

O access_token não expira. O access_token somente é invalidado nos seguintes casos:
  • Se um novo login for realizado com o usuário e senha
  • Se o usuário for bloqueado
  • Se a empresa for desativada
Implemente uma verificação para renovar o token automaticamente caso ele expire, evitando interrupções nas suas integrações.

Melhores Práticas de Segurança

Recomendado
  • ✅ Use HTTPS em todas as requisições
  • ✅ Armazene tokens de forma segura (variáveis de ambiente)
  • ✅ Nunca exponha tokens em URLs ou logs
  • ✅ Implemente rotação automática de tokens
  • ✅ Use senhas fortes para usuários API
  • ✅ Monitore uso anormal da API
Evite
  • ❌ Nunca commite tokens no Git
  • ❌ Não armazene tokens em cookies sem criptografia
  • ❌ Não compartilhe tokens entre diferentes ambientes
  • ❌ Evite hardcoding de credenciais
  • ❌ Não use tokens em requisições HTTP (sem S)
  • ❌ Não ignore erros de autenticação

Erros Comuns de Autenticação

Causa: O token fornecido está inválido, expirado ou não foi enviado.

Solução: Faça login novamente para obter um novo token válido.

{
  "success": false,
  "message": "Unauthenticated.",
  "error_code": "TOKEN_EXPIRED"
}

Causa: Email ou senha incorretos.

Solução: Verifique as credenciais e tente novamente.

{
  "success": false,
  "message": "Credenciais inválidas",
  "errors": {
    "email": ["Estas credenciais não correspondem aos nossos registros."]
  }
}

Causa: Muitas tentativas de login em curto período de tempo.

Solução: Aguarde alguns minutos antes de tentar novamente.

{
  "success": false,
  "message": "Muitas tentativas. Tente novamente em 60 segundos.",
  "retry_after": 60
}