> ## Documentation Index
> Fetch the complete documentation index at: https://docs.pag.finance/llms.txt
> Use this file to discover all available pages before exploring further.

# Autenticação

> Endpoints de autenticação Web3 por challenge-response: desafio, verificação e emissão de token JWT.

A autenticação segue o modelo challenge-response (estilo SIWS). A aplicação solicita um desafio, assina com a carteira do usuário e envia a assinatura para receber um token JWT.

<Info>
  O SDK oficial orquestra todo o fluxo via `client.auth.signIn(...)`. Veja [Autenticação e Configuração](/pt-BR/sdks/authentication).
</Info>

## Solicitar desafio

<ParamField header="Content-Type" type="string" required>
  `application/json`
</ParamField>

<ParamField body="address" type="string" required>
  Endereço da carteira que irá autenticar.
</ParamField>

<ParamField body="blockchain" type="string" required>
  Blockchain do endereço (por exemplo, `solana`).
</ParamField>

<ResponseField name="challenge" type="string">
  Mensagem de desafio (nonce) a ser assinada pela carteira.
</ResponseField>

<RequestExample>
  ```bash cURL theme={null}
  curl -X POST https://app.pag.finance/api/auth/challenge \
    -H "Content-Type: application/json" \
    -d '{ "address": "7NaNvh...", "blockchain": "solana" }'
  ```

  ```ts SDK theme={null}
  const { challenge } = await client.auth.challenge({
    address,
    blockchain: 'solana',
  });
  ```
</RequestExample>

<ResponseExample>
  ```json 200 theme={null}
  {
    "success": true,
    "data": {
      "challenge": "pag.finance quer que você assine: nonce=8f3c..."
    }
  }
  ```
</ResponseExample>

## Verificar assinatura

Envia a assinatura do desafio e recebe o token JWT.

<ParamField header="Content-Type" type="string" required>
  `application/json`
</ParamField>

<ParamField body="address" type="string" required>
  Endereço da carteira.
</ParamField>

<ParamField body="blockchain" type="string" required>
  Blockchain do endereço.
</ParamField>

<ParamField body="signature" type="string" required>
  Assinatura do desafio produzida pela carteira.
</ParamField>

<ResponseField name="tokenJWT" type="string">
  Token JWT a ser usado no cabeçalho `Authorization` das chamadas autenticadas.
</ResponseField>

<RequestExample>
  ```bash cURL theme={null}
  curl -X POST https://app.pag.finance/api/auth/verify \
    -H "Content-Type: application/json" \
    -d '{ "address": "7NaNvh...", "blockchain": "solana", "signature": "..." }'
  ```

  ```ts SDK theme={null}
  const { tokenJWT } = await client.auth.signIn(
    { address, blockchain: 'solana' },
    (challenge) => wallet.signMessage(new TextEncoder().encode(challenge)),
  );
  ```
</RequestExample>

<ResponseExample>
  ```json 200 theme={null}
  {
    "success": true,
    "data": {
      "tokenJWT": "eyJhbGciOiJIUzI1NiIsInR5cCI6..."
    }
  }
  ```
</ResponseExample>

## Enviar OTP

Envia um código de uso único (OTP) como fator adicional, quando aplicável ao fluxo.

<ResponseField name="sent" type="boolean">
  Indica se o código foi enviado com sucesso.
</ResponseField>

<RequestExample>
  ```ts SDK theme={null}
  await client.auth.otpSend({ /* parâmetros do fluxo de OTP */ });
  ```
</RequestExample>

## Uso do token

Inclua o token JWT no cabeçalho `Authorization` em todas as chamadas autenticadas:

```http theme={null}
Authorization: Bearer <tokenJWT>
```

<Warning>
  Em respostas `401`, refaça o login. O SDK pode automatizar esse processo com `client.auth.enableAutoRelogin(...)`.
</Warning>
