sign invalid | POST: /v1.0/iot-03/devices/{device_id}/commands

Developer Platform features usage and feedback.


Post Reply
wevertonl
Posts: 9

Code: Select all

import time
import hmac
import hashlib

# Definição da função generate_tuya_sign
def generate_tuya_sign(client_id, secret, http_method, url, query_params=None, body=None, access_token=None):
    # Timestamp atual em milissegundos
    timestamp = str(int(time.time() * 1000))

# 1. Criar o stringToSign
# Método HTTP
method = http_method.upper()

# Ordenar query_params por chave, se existirem
sorted_query = "&".join(f"{k}={v}" for k, v in sorted(query_params.items())) if query_params else ""

# Hash do corpo da requisição
if body:
    body_string = str(body)  # Certifique-se de serializar o corpo de forma consistente
    body_hash = hashlib.sha256(body_string.encode('utf-8')).hexdigest().lower()
else:
    body_hash = hashlib.sha256("".encode('utf-8')).hexdigest().lower()

# Concatenar no formato exigido
string_to_sign = f"{method}\n{body_hash}\n\n{url}?{sorted_query}"

# 2. Concatenar os parâmetros do sign
if access_token:
    string_to_sign = f"{client_id}{access_token}{timestamp}{string_to_sign}"
else:
    string_to_sign = f"{client_id}{timestamp}{string_to_sign}"

# 3. Gerar a assinatura usando HMAC-SHA256
sign = hmac.new(secret.encode('utf-8'), string_to_sign.encode('utf-8'), hashlib.sha256).hexdigest().upper()

return sign, timestamp

# Configuração para o endpoint de autenticação
client_id = "client"
secret = "secret"
http_method = "GET"  # Método HTTP da requisição
url = "/v1.0/token"  # Caminho relativo para o endpoint
query_params = {"grant_type": "1"}  # Parâmetros da query string
body = None  # Nenhum corpo necessário para este endpoint
access_token = None  # Não é necessário para autenticação inicial

# Gerar sign e timestamp
sign, timestamp = generate_tuya_sign(client_id, secret, http_method, url, query_params, body, access_token)

# Imprimir resultados
print("Sign:", sign)
print("Timestamp:", timestamp)
Post Reply