# Autenticação

Para acessar a API do Firehose é necessário um token de autenticação que pode ser obtido a partir do processo de Login com as credenciais do usuário.

Essas credenciais precisam ser solicitadas ao time responsável pelo Firehose (DataStream). As seguintes pessoas podem conceder acesso: [Júnior Rhis Lima](https://take.workplace.com/chat/t/100086976633376/), [Silvio Ramalho](https://take.workplace.com/chat/t/100081866202867/), [Janio Prates Otoni](https://take.workplace.com/chat/t/100091767874500/) e [Guilermo Pelizer Alves Pereira](https://take.workplace.com/chat/t/100087044430850/).

{% hint style="warning" %}
Após receber o usuário e senha pela primeira vez, **será necessário realizar a troca da senha** no respectivo portal do ambiente.

Caso a senha não tenha sido alterada, a requisição de login retornará o seguinte erro:

```json
{
  "error": "401",
  "message": "400 Bad Request: invalid_grant: Account is not fully set up"
}
```

{% endhint %}

## Acesso ao portal

* [Homologação](https://hmg-auth-firehose.blip.tools/realms/firehose/protocol/openid-connect/auth?client_id=security-admin-console)
* [Produção](https://auth-firehose.blip.ai/realms/firehose/protocol/openid-connect/auth?client_id=security-admin-console)

## Login

O token de acesso pode ser obtido de duas formas:

### JWT Token

De posse dos dados de login já com a senha alterada o seguinte endpoint precisa ser chamado para obtenção do token de acesso.

```bash
curl --location '<HOST>/v1/auth/login' \
--header 'Content-Type: application/json' \
--data '{
  "password": "PASSWORD",
  "username": "USERNAME"
}'
```

A resposta terá o seguinte formato:

```json
{
  "access_token": "ACCESS-TOKEN",
  "id_token": "ID-TOKEN",
  "expires_in": SECONDS,
  "refresh_expires_in": SECONDS,
  "refresh_token": "REFRESH-TOKEN",
  "token_type": "Bearer",
  "scope": "openid email profile"
}
```

O `ACCESS-TOKEN` possui um período de validade de 30 dias. Antes de seu vencimento, você tem a opção de renová-lo utilizando o `REFRESH-TOKEN`.

<details>

<summary>Atualização do Token JWT</summary>

Para atualizar o token do Firehose você pode utilizar o `refresh-token` recebido duirante a etapa de login:

```bash
curl --location '<HOST>/v1/auth/refresh-token' \
--header 'Content-Type: application/json' \
--data '{
  "refresh_token": "REFRESH-TOKEN"
}'
```

A resposta será a seguinte:

```json
{
  "access_token": "ACCESS-TOKEN",
  "id_token": "ID-TOKEN",
  "expires_in": SECONDS,
  "refresh_expires_in": SECONDS,
  "refresh_token": "REFRESH-TOKEN",
  "token_type": "Bearer",
  "scope": "openid email profile"
}
```

Para esta requisição, é necessário utilizar um `refresh-token` que **ainda esteja válido**. Desta forma, ela não pode ser usada para renovar tokens já vencidos e a autenticação terá que ser refeita com o login.

</details>

{% hint style="danger" %}
Requisições não autenticadas ou com algum problema de autenticação como por exemplo access token vencido resultarão em **status 401**. Nesse caso é recomendado ter uma tratativa de erro para realizar uma chamada na API de login e repetir novamente a requisição com os novos tokens de acesso.
{% endhint %}

> Exemplo de requisição que usa o token JWT

```bash
curl --location '<HOST>/v1/auth/inspect-token' \
--header 'Authorization: "ACCESS-TOKEN"'
```

### Basic Token

Caso o usuário tenha a autenticação via basic auth habilitado (necessário solicitar aos administradores), é possível gerar um `token basic` com o usuário e senha a partir do encode em base64 desses valores. Exemplo:

```bash
echo '<USERNAME>:<PASSWORD>' | base64 -w 0
```

A string em base64 resultante pode ser utilizada de uma semelhante a autenticação com token JWT, mas com a diferença que necessita do prefixo `Basic` antes da string resultante do comando acima.

A autenticação via basic auth é útil em rotinas que são executadas com periodicidade e não conseguem gerenciar o processo de atualização do token JWT.

> Exemplo de requisição que usa o token Basic

```bash
curl --location '<HOST>/v1/auth/inspect-token' \
--header 'Authorization: Basic <BASE64>'
```
