Gere na pratica suas chaves de acesso, SSL, client_id e token encriptado.
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.
- Acesse o Partner Hub
- Pelo Chat de suporte "Guru" Solicite ao time de Integrações as chaves de Integração com a Partner Hub API.
- Iremos gerar dois dados: ClientID e sua Private key
- ClientID é a sua identificação na Partner Hub API.
- A Private key é uma parte de duas, guardaremos a Public Key que será utilizado na criptografia.
- ⚠️ 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
- O desafio gera um tokem JWT encriptado que será necessário descriptografar a fim de obter sua Secret Key.
- 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())