EmsAuth plugin for HTTPie.

pip install httpie-ems-auth==0.2.2



This HTTPie auth plugin implements Escher authentication for Emarsys API requests.


HTTPie is a Python package, you need Python 2.7.* to be installed on your computer first. Be sure that HTTPie is installed (version 0.9.6, higher versions crash), and install this plugin.

MacOS specific installation

Important: do not install HTTPie via Brew.

To install python 2 before installing httpie-ems-auth, run brew install python.

pip install httpie==0.9.6
pip install httpie-ems-auth

Ubuntu 16.04 specific installation

In order to work around some Ubuntu specific errors, httpie and httpie-ems-auth has to be installed for the current user only.

pip install --user httpie==0.9.6
pip install --user httpie-ems-auth

This installs the http binary to the directory ~/.local/bin. It is recommended to add this directory to the current user's path by adding $HOME/.local/bin to the PATH (ie. by modifying ~/.profile: change the PATH="$HOME/bin:$PATH" to PATH="$HOME/bin:$HOME/.local/bin:$PATH".)


After installation, execute http --help | grep ems-auth.

Success criteria: the command returns lines containing ems-auth.


Suiteable if you call the API of Suite

http --auth-type=ems-auth --auth=escher_key:escher_secret

The default Escher credential scope is "eu/suite/ems_request" which identifies Suite. If u are calling another service, you have to alter the credential scope like this:

http --auth-type=ems-auth --auth=eu/suite/ems_request/escher_key:escher_secret

Check out HTTPie sessions, if you would like to save authentication information between your requests.

If you want to use in python code this example can help:

      import escherauth
      import datetime
      from urlparse import urlparse
      import requests
      escher_key = 'test'
      escher_secret = 'test'
      options = {
                  'algo_prefix': 'EMS',
                  'vendor_key': 'EMS',
                  'hash_algo': 'SHA256',
                  'auth_header_name': 'X-Ems-Auth',
                  'date_header_name': 'X-Ems-Date'
      credential_scope = "test"
      if "/" in escher_key:
          scope = escher_key.split("/")
          escher_key = scope.pop()
          credential_scope = "/".join(scope)
      client = {'api_key': escher_key, 'api_secret': escher_secret}
      escher = escherauth.Escher(credential_scope, options)
      url = ''
      r = requests.PreparedRequest()
      now = datetime.datetime.utcnow()
      r.headers['X-Ems-Date'] = now.strftime('%Y%m%dT%H%M%SZ')
      parsed_uri = urlparse(r.url)
      r.headers['Host'] = parsed_uri.netloc
      f = escher.sign(r, client)
      s = requests.Session()