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

Diagrama autenticação

Diagrama autenticação

❗️

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.


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" 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. ⚠️ 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 passando seu ClientID.
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));
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), 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!

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)


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())