# 9.4 - Autenticação em APIs

Para garantir segurança e controle de acesso, as APIs utilizam diferentes **métodos de autenticação**. Abaixo estão os principais:

## 🔑 **Chaves de API (API Keys)**

* São **strings únicas** geradas pelo servidor, associadas a um usuário ou aplicação.
* Enviadas com a requisição (geralmente no header ou na URL) para **identificar quem está acessando a API**.
* São simples de usar, mas **menos seguras**, pois podem ser facilmente expostas se o código for público.

#### 📌 Exemplo:

{% code title="http" %}

```javascript
GET https://api.exemplo.com/dados?api_key=123abc456def

```

{% endcode %}

#### 📦 **Uso comum**:

* APIs públicas com limitações (ex: Google Maps, OpenWeather).
* Monitoramento básico de uso por usuário/aplicação.

#### 🟢 **Vantagens:**

* Simplicidade: Fácil de implementar e usar.
* Boa para serviços simples ou públicos.
* Pode ser usada para monitorar e controlar o uso da API.

#### 🔴 **Desvantagens:**

* Segurança limitada: A chave pode ser facilmente exposta se não protegida corretamente.
* Sem controle granular: Geralmente não diferencia usuários nem permissões.
* Sem mecanismo nativo para expiração ou revogação rápida.

***

## 🔐 **OAuth (Open Authorization)**

* Protocolo padrão para **autenticação segura e delegada**.
* Permite que um app acesse dados do usuário **sem precisar saber sua senha**.
* Muito usado por grandes plataformas como **Google, Facebook, GitHub, Twitter**, etc.

#### 🧭 **Como funciona (fluxo simplificado)**:

1. O usuário é redirecionado para fazer login no serviço (ex: Google).
2. Ele autoriza o app a acessar determinados dados.
3. Um **token de acesso** é gerado e enviado ao app.
4. O app usa esse token para fazer requisições autenticadas.

#### 📌 **Exemplo de uso**:

* Login com Google/Facebook em sites e apps.

#### 🟢 **Vantagens:**

* Alto nível de segurança: Não expõe as credenciais do usuário.
* Permite controle granular de permissões via escopos.
* Suporta autenticação delegada e acesso temporário.
* Amplamente adotado por grandes plataformas (Google, Facebook, etc).

#### 🔴 **Desvantagens:**

* Complexidade maior para implementar e entender.
* Fluxo de autenticação pode ser mais demorado para o usuário.
* Requer mais configurações no servidor e cliente.

***

## 🪪 **JWT (JSON Web Tokens)**

* Tokens **compactos, seguros e autocontidos** em formato JSON.
* Usados para **autenticação e troca de informações entre partes confiáveis**.
* Contêm três partes codificadas em Base64:

  * **Header** (tipo e algoritmo).
  * **Payload** (informações do usuário ou permissões).
  * **Signature** (verificação de integridade).

#### 📌 **Exemplo de estrutura**:

{% code title="nginx" %}

```javascript
{
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImdhYmJ1Iiwicm9sZSI6InVzZXIiLCJleHAiOjE3MDAwMDAwMDB9.abc123..."
}

```

{% endcode %}

#### 📦 **Uso comum**:

* APIs REST que exigem autenticação com sessões stateless (sem guardar estado no servidor).
* Aplicações modernas com login baseado em token.

#### 🟢 **Vantagens:**

* Stateless: O servidor não precisa armazenar sessões.
* Compacto e auto-contido, facilita transporte em headers HTTP.
* Pode incluir informações úteis no payload (ex: permissões).
* Permite autenticação e autorização eficientes.

#### 🔴 **Desvantagens:**

* O token pode ficar muito grande se incluir muitos dados.
* Se vazado, o token pode ser usado até expirar (revogação é complexa).
* Payload é codificado, mas não criptografado — não deve conter dados sensíveis.
* Requer uso de HTTPS para segurança.
