import os, base64, time, uuid, requests
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes, serialization
from cryptography.hazmat.primitives.asymmetric import padding
def sign(data_to_sign, private_key):
data_bytes = str.encode(data_to_sign)
signature = private_key.sign(data_bytes, padding.PKCS1v15(), hashes.SHA256())
return base64.b64encode(signature).decode('UTF-8')
def sign_for_zodia(company_identifier, url, payload):
request_identifier = str(uuid.uuid4())
request_timestamp = str(int(time.time() * 1000))
data_to_sign = ":".join([company_identifier, request_identifier, request_timestamp, url, payload])
submitter_id = "api-maker@zodia.io"
print(data_to_sign) # ZTEST:c730a02f-105d-4899-87aa-b1b8280e4a7e:1620141458133:https://dummy.server/v3/api/servicedesk/create:{}
with open(os.path.join("keys", company_identifier + ".private.pem"), "rb") as private_key_in:
rsa_private_key = serialization.load_pem_private_key(private_key_in.read(),
password=None,
backend=default_backend())
signature = sign(data_to_sign, rsa_private_key)
return company_identifier, request_identifier, request_timestamp, signature, submitter_id
if __name__ == "__main__":
full_url = "https://dummy.server/v3/api/servicedesk/create"
payload = json.dumps({})
headers = sign_for_zodia("ZTEST", full_url, "{}")
# Please make sure you use the same payload in the request & generation of signature without any change of a space or new line.
# In this case the payload is {}
response = requests.post(full_url, headers={
"submitter-id": headers[4], # Email ID of the API User i.e. api-maker@zodia.io
"company-identifier": headers[0], # ZTEST
"request-identifier": headers[1], # c730a02f-105d-4899-87aa-b1b8280e4a7e
"request-timestamp": headers[2], # 1620141458133
"signature": headers[3] # aZBZNDeDJomgRBZFhV24MbdlyfSiqJuCMgz5mSl+dpxtDDgbadTuin0z920eBD2YFP5g3ccakguQUXPMuLp4Umyet3hGYXb2GiMkKSIA8XocdF8uG2xReSZq+JSbuDSO7yQcxXVK10A6mL2f/zJuTFBRl20jegiHOBcbDlAOUkWS3Vam3KRLA/Nd8ZwOhK6XZbtZWGz0AW9obE7cpEwqUEposucx7J462XAaM9Duh+CF1ALhuo67G0hLYAtwqryRVhUdBvVrqoWgGu3quxfIYgG/8okYv2hHjzBtIfo2VREi4TlgsRXvGPQpSI534S8o9laa5Ddq1f6N2u1sXkE97g==
}, data = payload)