---
agentTools:
  projectIndex: https://partnerhubapi.stone.com.br/llms.txt
---

# Gerando a Autenticação

Gere na pratica suas chaves de acesso, SSL, client_id e token encriptado.

[block:image]
{
  "images": [
    {
      "image": [
        "https://files.readme.io/1fcb6a8962113d78ccf34bae51e91f1211c5e6a8bbe4323bf2f08fa8b6f3e04e-Autenticacao1.drawio.svg",
        "",
        ""
      ],
      "align": "center",
      "caption": "Diagrama autenticação"
    }
  ]
}
[/block]

> ❗️ Atenção!
>
> Você nunca deve compartilhar a **chave privada** !
>
> A chave privada deve ser armazenada de forma segura por você.\
> Em posse da sua chave privada, qualquer aplicação pode decodificar a assinatura e verificar se ela é válida. Por isso destacamos a importância de manter essa informação em segurança.

<br />

### 1. Cadastro da Aplicação

Nós iremos disponibilizar os dados para que autenticar na API , para isso siga os seguintes passo.

1. Acesse o Partner Hub
2. Pelo Chat de suporte "[Guru](https://ajuda-partnerprogram.stone.com.br/pt-BR/articles/9204794-como-solicitar-suporte-via-partner-hub-guru)" Solicite ao time de Integrações as chaves de Integração com a Partner Hub API.
3. Iremos gerar dois dados: **ClientID** e sua **Private key**
   1. ClientID é a sua identificação na Partner Hub API.
   2. A Private key é uma parte de duas, guardaremos a Public Key que será utilizado na criptografia.
   3. :warning: Atenção: A Private key tem visualização **única** no Partner Hub, não persistiremos em banco de dados. **Salve-a em um local seguro**.

### 2. Desafio

Agora é preciso gerar o Token de desafio utilizando o ClientID gerando anteriormente

1. O desafio gera um tokem JWT encriptado que será necessário descriptografar a fim de obter sua Secret Key.
2. Faça a requisição no endpoint [Challenge](https://partnerhubapi.stone.com.br/reference/challenge) passando seu ClientID.

```javascript JS
const myHeaders = new Headers();
myHeaders.append("Content-Type", "application/json");


const raw = JSON.stringify({
  "client_id": "5b85f123-1d81-45a9-8726-0a8ccfdsw34f"
});

const requestOptions = {
  method: "POST",
  headers: myHeaders,
  body: raw,
  redirect: "follow"
};

fetch("https://partnerhub-sdx-external-api.stone.com.br/auth/challenge", requestOptions)
  .then((response) => response.text())
  .then((result) => console.log(result))
  .catch((error) => console.error(error));
```
```python Pyhton
import requests
import json

url = "https://partnerhub-sdx-external-api.stone.com.br/auth/challenge"

payload = json.dumps({
  "client_id": "5b85f956-1d81-45a9-8726-0a8ccabdc63e"
})
headers = {
  'Content-Type': 'application/json',
  'Cookie': '_cfuvid=Rup.LzDKytuZcJb245zM7xFGyKNyraNcPMLoYGlt6BA-1729033883744-0.0.1.1-604800000; AWSALBTG=bG+jMyUkfquhhaE/rqo2hUI1MlOWXTzKb5x26qfrJSu05GMcYdJD4gbKi+GXgkbU/hOcXFGuau+KpCuEiy4l9fHlRWNE5WRt7cTBeCeMNLuC0MQH8LGLfvI/BgHvzhusKzlQe0X0w3w4IBOT1/erzbCk/6P2+sgDsuFO967rjtWsXVAsmk4=; AWSALBTGCORS=bG+jMyUkfquhhaE/rqo2hUI1MlOWXTzKb5x26qfrJSu05GMcYdJD4gbKi+GXgkbU/hOcXFGuau+KpCuEiy4l9fHlRWNE5WRt7cTBeCeMNLuC0MQH8LGLfvI/BgHvzhusKzlQe0X0w3w4IBOT1/erzbCk/6P2+sgDsuFO967rjtWsXVAsmk4='
}

response = requests.request("POST", url, headers=headers, data=payload)

print(response.text)

```

> 🚧 O Token de desafio tem validade de 24 horas
>
> Recomendamos criar um fluxo para geração de novos Desafios validando o período ou fazer uma nova requisição ao tomar o primeiro erro de `unauthorized`.

### 3. Gerando a Autorização

Agora é preciso descriptografar o token JWT obtido no challenge, após desciptografar obterá a Secret Key de autorização para os demais endpoints da API.

**Método:** O processo é parte do conceito de **criptografia assimétrica**, utilizando:

* **Chave pública** para criptografar os dados. (API do Partner Hub)
* **Chave privada** para descriptografar os dados. (Desenvolvedor parceiro)

Em seu código receba como parâmetro:

* **PRIVATE\_KEY:** A chave privada usada para descriptografar o conteúdo.
* **Challenge:** O valor do desafio ([challenge](https://partnerhubapi.stone.com.br/reference/challenge)), que será descriptografado.

Crie o objeto de de descriptografia para RSA, utilize a biblioteca de Decrypt disponível em sua linguagem de desenvolvimento. Como resultado você deve obter o a Secret Key.

### Exemplo de Código

Para ajudar na realização da descriptografia, disponibilizamos alguns exemplos de códigos prontos!

```javascript JavaScript
const { privateDecrypt } = require('crypto')

//Chave privada RSA
const PRIVATE_KEY = "-----BEGIN RSA PRIVATE KEY-----\COLOQUE SUA PRIVATE KEY AQUI-----END RSA PRIVATE KEY-----"

// Token criptografado (challenge) em formato hexadecimal
const challenge = "COLOQUE O TOKEN JWT AQUI"

//Criar o objeto de descriptografia e Descriptografar o challenge
const result = privateDecrypt(PRIVATE_KEY, Buffer.from(challenge, 'hex')).toString()

//Imprimira Secret Key
console.log('[token]', result)


```
```python Python
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
import binascii

#Chave privada RSA
PRIVATE_KEY = """-----BEGIN RSA PRIVATE KEY-----\COLOQUE SUA PRIVATE KEY AQUI-----END RSA PRIVATE KEY-----\n"""
#Token criptografado (challenge) em formato hexadecimal
challenge = "COLOQUE O TOKEN JWT AQUI"

#Carregar a chave privada RSA
private_key = RSA.import_key(PRIVATE_KEY)

#Criar o objeto de descriptografia usando PKCS1_OAEP com SHA-256
cipher = PKCS1_OAEP.new(private_key)

#Descriptografar o challenge
decrypted_message = cipher.decrypt(binascii.unhexlify(challenge))

#Imprimira Secret Key
print('[token]', decrypted_message.decode())

```