Skip to main content

EscherPython - HTTP request signing lib Build Status

Escher helps you creating secure HTTP requests (for APIs) by signing HTTP(s) requests. It's both a server side and client side implementation. The status is work in progress.

The algorithm is based on Amazon's AWS Signature Version 4, but we have generalized and extended it.

More details are available at escherauth.io.

Signing a request

Escher works by calculating a cryptographic signature of your request, and adding it (and other authentication information) to said request.

Usually you will want to add the authentication information to the request by appending extra headers to it.

from escherauth import Escher

request = {
    'method': 'POST',
    'url': '/',
    'host': 'example.com',
    'headers': [
        ['X-Foo', 'bar'],
    ],
    'body': '{"this_is": "a_request_body"}',
}

escher = Escher('YOUR_ACCESS_KEY_ID', 'YOUR SECRET', 'example/credential/scope')
signed_request = escher.sign_request(request)

from pprint import pprint
pprint(signed_request)

Signing a Requests request:

import requests
from escherauth import EscherRequestsAuth

auth = EscherRequestsAuth('YOUR_ACCESS_KEY_ID', 'YOUR SECRET', 'example/credential/scope')
response = requests.post('https://httpbin.org/post', json={'this_is': 'a_request_body'}, auth=auth)

from pprint import pprint
pprint(response.json())

Presigning a URL

In some cases you may want to send authenticated requests from a context where you cannot modify the request headers, e.g. when embedding an API generated iframe.

You can however generate a presigned URL, where the authentication information is added to the query string.

from escherauth import Escher

escher = Escher('YOUR_ACCESS_KEY_ID', 'YOUR SECRET', 'example/credential/scope')
presigned_url = escher.presign_url('http://example.com/', expires=300)

print(presigned_url)

Validating a request

You can validate a request signed by the methods described above. For that you will need a database of the access keys and secrets of your clients.

from escherauth import Escher, EscherException

escher = Escher('', '', 'example/credential/scope')

signed_request = {
    'body': '{"this_is": "a_request_body"}',
    'headers': [
        ['Host', 'example.com'],
        ['X-Escher-Date', '20240227T121443Z'],
        ['X-Escher-Auth', 'ESR-HMAC-SHA256 Credential=YOUR_ACCESS_KEY_ID/20240227/example/credential/scope, SignedHeaders=host;x-escher-date, Signature=5febb099193b8e6c4027ff810e0faa5bc8a275efb46f2d5c1af8810f4332c4cb'],
    ],
    'method': 'POST',
    'url': '/',
}
key_db = {
    'ACCESS_KEY_OF_CLIENT_1': 'SECRET OF CLIENT 1',
    'ACCESS_KEY_OF_CLIENT_42': 'SECRET OF CLIENT 42',
}

try:
    escher.authenticate(signed_request, key_db)
    print('OK')
except EscherException as e:
    print(f'The validation failed: {e}')

Metadata

Release files for escherauth 2.0.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for escherauth 2.0.0
File Size Uploaded
escherauth-2.0.0.tar.gz 11.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for escherauth 2.0.0
File Interpreter ABI Platform
escherauth-2.0.0-py3-none-any.whl Python 3 none any Details

Total release size: 18.8 kB

Release files / escherauth-2.0.0.tar.gz

Download URL escherauth-2.0.0.tar.gz
Size 11.0 kB
Tags Source
SHA-256 checksum
How to use checksums
dc93446f94f01afe182756d4cd1d69f24ead63dbee16872cc44fa95f9c272c74
BLAKE2b-256 checksum
How to use checksums
f0fdba7e736f0a725cda88cac172701df38953b4351787096056d716e6543679
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/5.1.0 CPython/3.9.19

Release files / escherauth-2.0.0-py3-none-any.whl

Download URL escherauth-2.0.0-py3-none-any.whl
Size 7.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
ced8edcb38f800ebcdaf917fe3856892b2a93199719d6c7ef98dd7f75f0d11f6
BLAKE2b-256 checksum
How to use checksums
88571cea34f223110fc01ac5950e8f9af6e60417dffb71433f725f2cdba86694
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/5.1.0 CPython/3.9.19

Release history Release notifications | RSS feed

2.0.1

2 release files

This release

2.0.0 This release

2 release files

1.0.3

2 release files

1.0.2

2 release files

1.0.1

2 release files

1.0.0

2 release files

0.3.4

2 release files

0.3.1

5 release files

0.3.0

4 release files

0.2.5

2 release files

0.2.4

2 release files

0.2.3

2 release files

0.2.2

2 release files

0.2.1

2 release files

0.2.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page