# Modelo de integração OAuth2 com a Digibee

Este documento apresenta um modelo de implementação de fluxo OAuth2 para autenticação e autorização em integrações realizadas na Digibee Integration Platform. O objetivo é garantir o acesso seguro a APIs protegidas, utilizando tokens de acesso e refresh tokens quando aplicável.

Você aprenderá o padrão de implementação do fluxo de autenticação OAuth2 na Digibee, incluindo:

* Etapas de geração de credenciais
* Obtenção do token
* Renovação (refresh) do token
* Remoção de credenciais

{% hint style="info" %}
**Observações importantes:**

* O pipeline deve ser configurado com, no mínimo, duas execuções simultâneas (Digibee Execution Config) para garantir o correto funcionamento do mecanismo, já que ele realiza uma autochamada para gerar o token.
* O fluxo de OAuth2 segue o padrão de autorização `client_credentials`, adequado para integrações entre sistemas, sem interação humana.
* A renovação (refresh) do token é realizada automaticamente antes da expiração, garantindo que um token válido esteja sempre disponível para uso.
  {% endhint %}

## **Arquitetura**

### **Visão geral**

Diagrama:

{% @mermaid/diagram content="flowchart LR
A\[Sistema externo] --> B\[Pipeline OAuth2]
B --> C\[Criação de credenciais]
C --> D\[Obtenção do token de acesso]
D --> E\[Renovação do token]
E --> F\[Exclusão de credenciais]" %}

Pipeline:

<figure><img src="https://content.gitbook.com/content/XfrDexGOLMin51pAiWkq/blobs/vkLdtrIWSLva3HHYGfxF/pipe-oauth2.png" alt=""><figcaption></figcaption></figure>

### **Descrição**

* Os pipelines implementam um fluxo completo de autenticação OAuth2, permitindo:
  * Criação de credenciais
  * Obtenção do token de acesso
  * Renovação (refresh) do token
  * Exclusão de credenciais
* O pipeline responsável pode ser acionado tanto para geração inicial do token quanto para renovação ou gestão das credenciais, de acordo com os parâmetros de entrada.
* Esse mecanismo pode ser reutilizado por outros pipelines de negócio por meio de chamadas de evento, API ou encapsulamento em cápsulas.

### **Fluxo detalhado**

1. **Geração de credenciais**
   * Cria um par `clientId` e `clientSecret` para futuras autenticações.
2. **Obtenção de token**
   * Gera o token de acesso (`access_token`) e o `refresh_token`.
3. **Renovação de token**
   * Renova o token de acesso utilizando o `refresh_token` antes da expiração.
4. **Remoção de credenciais**
   * Remove as credenciais (`clientId`) do sistema de autenticação.

### **Payloads**

#### **1. Geração de credenciais**

Request:

```json
{
    "partnerId": "TestSistema",
    "executionType": "create",
    "apikey": "..."
}
```

​Response:

```json
{
    "clientId": "clientId",
    "clientSecret": "clientSecret"
}
```

#### **2. Obtenção do token**

Request:

```json
{
    "password": "clientSecret",
    "grant_type": "client_credentials",
    "username": "clientId"
}
```

Response:

```json
{
    "token_type": "Bearer",
    "expires_in": 3600000,
    "ext_expires_in": 3600000,
    "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
    "refresh_token": "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9..."
}
```

#### **3. Renovação (refresh) do token**

Request:

```json
{
    "grant_type": "refresh_token",
    "refresh_token": "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9..."
}
```

Response:

```json
{
    "token_type": "Bearer",
    "expires_in": 3600000,
    "ext_expires_in": 3600000,
    "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
    "refresh_token": "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9..."
}
```

#### **4. Exclusão de credenciais**

Request:

```json
{
    "clientId": "clientId",
    "executionType": "delete",
    "apikey": "..."
}
```

Response:

```json
{
    "code": 200,
    "message": "Success when deleting client credentials for the clientId: clientId"
}
```
