Skip to content

Module veryfi.client_base

View Source
import requests

import base64

import hashlib

import hmac

import json

import time

from typing import Dict, Optional

from veryfi.errors import VeryfiClientError

class Client:

    API_VERSION = "v8"

    API_TIMEOUT = 30

    BASE_URL = "https://api.veryfi.com/api/"

    def __init__(

        self,

        client_id: str,

        client_secret: str,

        username: str,

        api_key: str,

        base_url: str = BASE_URL,

        api_version: str = API_VERSION,

        timeout: int = API_TIMEOUT,

    ):

        self.client_id = client_id

        self.client_secret = client_secret

        self.username = username

        self.api_key = api_key

        self.base_url = base_url

        self.api_version = api_version

        self.versioned_url = self.base_url + self.api_version

        self.timeout = timeout

        self.headers = {}

        self._session = requests.Session()

    def _get_headers(self) -> Dict:

        """

        Prepares the headers needed for a request.

        :return: Dictionary with headers

        """

        final_headers = {

            "User-Agent": "Python Veryfi-Python/5.0.0",

            "Accept": "application/json",

            "Content-Type": "application/json",

            "Client-Id": self.client_id,

        }

        final_headers.update({"Authorization": f"apikey {self.username}:{self.api_key}"})

        return final_headers

    def _request(

        self,

        http_verb: str,

        endpoint_name: str,

        request_arguments: Optional[Dict] = None,

        query_params: Optional[Dict] = None,

    ):

        """

        Submit the HTTP request.

        :param http_verb: HTTP Method

        :param endpoint_name: Endpoint name such as 'documents', 'users', etc.

        :param request_arguments: JSON payload to send to Veryfi

        :return: A JSON of the response data.

        """

        headers = self._get_headers()

        api_url = f"{self.versioned_url}/partner{endpoint_name}"

        request_arguments = request_arguments or {}

        if self.client_secret:

            timestamp = int(time.time() * 1000)

            signature = self._generate_signature(request_arguments, timestamp=timestamp)

            headers.update(

                {

                    "X-Veryfi-Request-Timestamp": str(timestamp),

                    "X-Veryfi-Request-Signature": signature,

                }

            )

        response = self._session.request(

            http_verb,

            url=api_url,

            params=query_params or None,

            headers=headers,

            data=json.dumps(request_arguments),

            timeout=self.timeout,

        )

        if response.status_code not in [200, 201, 202, 204]:

            raise VeryfiClientError.from_response(response)

        return response.json()

    def _generate_signature(self, payload_params: Dict, timestamp: int) -> str:

        """

        Generate unique signature for payload params.

        :param payload_params: JSON params to be sent to API request

        :param timestamp: Unix Long timestamp

        :return: Unique signature generated using the client_secret and the payload

        """

        payload = f"timestamp:{timestamp}"

        for key in payload_params.keys():

            value = payload_params[key]

            payload = f"{payload},{key}:{value}"

        secret_bytes = bytes(self.client_secret, "utf-8")

        payload_bytes = bytes(payload, "utf-8")

        tmp_signature = hmac.new(secret_bytes, msg=payload_bytes, digestmod=hashlib.sha256).digest()

        base64_signature = base64.b64encode(tmp_signature).decode("utf-8").strip()

        return base64_signature

Classes

Client

class Client(
    client_id: str,
    client_secret: str,
    username: str,
    api_key: str,
    base_url: str = 'https://api.veryfi.com/api/',
    api_version: str = 'v8',
    timeout: int = 30
)
View Source
class Client:

    API_VERSION = "v8"

    API_TIMEOUT = 30

    BASE_URL = "https://api.veryfi.com/api/"

    def __init__(

        self,

        client_id: str,

        client_secret: str,

        username: str,

        api_key: str,

        base_url: str = BASE_URL,

        api_version: str = API_VERSION,

        timeout: int = API_TIMEOUT,

    ):

        self.client_id = client_id

        self.client_secret = client_secret

        self.username = username

        self.api_key = api_key

        self.base_url = base_url

        self.api_version = api_version

        self.versioned_url = self.base_url + self.api_version

        self.timeout = timeout

        self.headers = {}

        self._session = requests.Session()

    def _get_headers(self) -> Dict:

        """

        Prepares the headers needed for a request.

        :return: Dictionary with headers

        """

        final_headers = {

            "User-Agent": "Python Veryfi-Python/5.0.0",

            "Accept": "application/json",

            "Content-Type": "application/json",

            "Client-Id": self.client_id,

        }

        final_headers.update({"Authorization": f"apikey {self.username}:{self.api_key}"})

        return final_headers

    def _request(

        self,

        http_verb: str,

        endpoint_name: str,

        request_arguments: Optional[Dict] = None,

        query_params: Optional[Dict] = None,

    ):

        """

        Submit the HTTP request.

        :param http_verb: HTTP Method

        :param endpoint_name: Endpoint name such as 'documents', 'users', etc.

        :param request_arguments: JSON payload to send to Veryfi

        :return: A JSON of the response data.

        """

        headers = self._get_headers()

        api_url = f"{self.versioned_url}/partner{endpoint_name}"

        request_arguments = request_arguments or {}

        if self.client_secret:

            timestamp = int(time.time() * 1000)

            signature = self._generate_signature(request_arguments, timestamp=timestamp)

            headers.update(

                {

                    "X-Veryfi-Request-Timestamp": str(timestamp),

                    "X-Veryfi-Request-Signature": signature,

                }

            )

        response = self._session.request(

            http_verb,

            url=api_url,

            params=query_params or None,

            headers=headers,

            data=json.dumps(request_arguments),

            timeout=self.timeout,

        )

        if response.status_code not in [200, 201, 202, 204]:

            raise VeryfiClientError.from_response(response)

        return response.json()

    def _generate_signature(self, payload_params: Dict, timestamp: int) -> str:

        """

        Generate unique signature for payload params.

        :param payload_params: JSON params to be sent to API request

        :param timestamp: Unix Long timestamp

        :return: Unique signature generated using the client_secret and the payload

        """

        payload = f"timestamp:{timestamp}"

        for key in payload_params.keys():

            value = payload_params[key]

            payload = f"{payload},{key}:{value}"

        secret_bytes = bytes(self.client_secret, "utf-8")

        payload_bytes = bytes(payload, "utf-8")

        tmp_signature = hmac.new(secret_bytes, msg=payload_bytes, digestmod=hashlib.sha256).digest()

        base64_signature = base64.b64encode(tmp_signature).decode("utf-8").strip()

        return base64_signature

Descendants

  • veryfi.client.Client

Class variables

API_TIMEOUT
API_VERSION
BASE_URL