# Autenticação

{% hint style="info" %}
Todas as solicitações para a API da Discloud devem incluir um **Token da API** no cabeçalho `api-token`.

Se você ainda não tem um token, gere ou recupere-o no seu painel da Discloud. (Substitua esta nota pelo link exato do painel ou uma captura de tela.)
{% endhint %}

***

## ⚙️ Como Funciona

{% stepper %}
{% step %}
Você gera um [token](/faq/general-questions/how-can-i-get-my-discloud-api-token.md) único vinculado à sua conta.
{% endstep %}

{% step %}
Para cada solicitação HTTP, inclua o cabeçalho: `api-token: SEU_TOKEN_AQUI`.
{% endstep %}

{% step %}
O token autentica e autoriza ações em nome da sua conta (nunca compartilhe-o).
{% endstep %}

{% step %}
Use o endpoint `/user` para validar rapidamente o token.
{% endstep %}
{% endstepper %}

***

## 📤 Enviando o Token

{% tabs %}
{% tab title="cURL" %}

```bash
curl -X GET \
  -H "api-token: $DISCLOUD_TOKEN" \
  https://api.discloud.app/v2/user
```

{% endtab %}

{% tab title="Node.js (fetch)" %}

```javascript
import fetch from "node-fetch";

async function getCurrentUser() {
  const res = await fetch("https://api.discloud.app/v2/user", {
    headers: { "api-token": process.env.DISCLOUD_TOKEN },
  });

  if (!res.ok) {
    console.error("Solicitação falhou:", res.status, await res.text());
    return;
  }
  const data = await res.json();
  console.log(data);
}
```

{% endtab %}

{% tab title="Node.js (discloud.app SDK)" %}

```javascript
// Instale primeiro: npm i discloud.app
const { discloud } = require("discloud.app");

async function validateToken() {
  try {
    const user = await discloud.login("DISCLOUD_API_TOKEN");
    console.log("Usuário autenticado:", user);
  } catch (e) {
    console.error("Token inválido ou erro de rede:", e.message);
  }
}
```

{% endtab %}
{% endtabs %}

***

## 🛡 Protegendo o Token

{% hint style="warning" %}
Nunca commite seu token (ex. no Git). Armazene-o em variáveis de ambiente ([`.env`](/faq/general-questions/.env-file.md), segredos CI/CD, etc.).
{% endhint %}

📌 Melhores práticas:

* Use variáveis de ambiente em vez de codificar.
* Rotacione o token periodicamente (ex. a cada 90 dias).
* Revogue e regenere imediatamente se suspeitar de exposição.
* Restrinja quem pode acessar a infraestrutura onde a variável está armazenada.

***

## ⚡ Verificação Rápida do Token

Chame `/user` logo após definir a variável de ambiente. Se você receber HTTP 200 com dados do usuário, a autenticação está funcionando.

{% hint style="info" %}
Você também pode atualizar a localidade do usuário (ex. `en-US`) através de `/locale/{locale}` para validar outra rota autenticada.
{% endhint %}

***

## 📚 Referência dos Endpoints Relacionados

As operações abaixo requerem o cabeçalho `api-token`:

## Obter informações do usuário atual

> Retorna informações sobre o usuário autenticado

```json
{"openapi":"3.0.4","info":{"title":"Discloud API","version":"2.0.0"},"tags":[{"name":"Usuário","description":"Operações sobre usuários"}],"servers":[{"url":"https://api.discloud.app/v2","description":"Servidor API"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-token"}},"schemas":{"UserResponse":{"type":"object","properties":{"status":{"type":"string"},"message":{"type":"string"},"user":{"$ref":"#/components/schemas/User"}}},"User":{"type":"object","properties":{"userID":{"type":"string","description":"O ID do usuário"},"totalRamMb":{"type":"integer","description":"RAM total alocada (em MB)"},"ramUsedMb":{"type":"integer","description":"RAM atualmente sendo usada (em MB)"},"subdomains":{"type":"array","items":{"type":"string"},"description":"Lista de subdomínios pertencentes"},"customdomains":{"type":"array","items":{"type":"string"},"description":"Lista de domínios personalizados pertencentes"},"apps":{"type":"array","items":{"type":"string"},"description":"Lista de IDs das aplicações pertencentes"},"plan":{"type":"string","description":"O plano de assinatura"},"locale":{"type":"string","description":"O idioma/localização"},"lastDataLeft":{"type":"object","properties":{"days":{"type":"integer","description":"Dias restantes no plano atual"},"hours":{"type":"integer","description":"Horas restantes no plano atual"},"minutes":{"type":"integer","description":"Minutos restantes no plano atual"},"seconds":{"type":"integer","description":"Segundos restantes no plano atual"}},"description":"Tempo restante do plano atual"},"planDataEnd":{"type":"string","format":"date-time","description":"Data de término do plano atual"}}},"Error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"paths":{"/user":{"get":{"tags":["Usuário"],"summary":"Obter informações do usuário atual","description":"Retorna informações sobre o usuário autenticado","operationId":"getCurrentUser","responses":{"200":{"description":"Operação bem-sucedida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}},"401":{"description":"Erro de autenticação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.discloud.com/api-and-integrations/api-overview/authentication.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
