Autorizarea

Descriere - Autorizare

  • Pentru accesarea API-urilor Keez este necesară obținerea unui token de acces (bearer token), folosind fluxul OAuth 2.0 client credentials

  • Dat fiind faptul că aplicația permite asocierea unui cont la mai mulți clienți, apelurile către API necesită în general și specificarea unui «clientEid», un identificator al clientului și un secret, de asemenea furnizat de Keez.

Medii

  • Aplicația keez.ro pune la dispoziție două medii complet separate pentru realizarea operațiile specifice acestui API:
    Staging
    • Este un mediu dedicat testării API-ului de facturare. Orice factură realizată în acest mediu nu are impact contabil

    Atenționare

    La intervale semi-regulate acest mediu este rescris. Adică toate datele (facturi, articole) vor fi șterse complet fără posibilitate de recuperare de niciun fel

    Producție sau App
    • Este mediul de producție. Orice factură realizată în acest mediu va impacta direct contabilitatea clientului

    Atenționare

    Acest mediu nu este niciodată rescris. Orice articol sau factură realizată în acest mediu va rămâne permanent stocată în sistem

Atenționare

Mediile stage și prod sunt complet separate din toate punctele de vedere: locație server, aplicație online, bază de date, apeluri API API. Orice adăugare, modificare sau ștergere pe un mediu nu va avea impact asupra celuilalt

Proprietăți

Atenționare

Pentru procurarea următoarelor proprietăți necesare, vă rugăm să contactați firma Keez.ro

Proprietăți necesare la apelul API-ului pentru obținerea token-ului de autorizare:
client_eid
  • este un identificator extern pentru compania care folosește API-ul

  • fiecare client primește un identificator unic

  • este oferit de un reprezentant https://keez.ro/

application_id
  • este un identificator al aplicației

  • este oferit de un reprezentant https://keez.ro/

secret

Notă

Pentru a înțelege mai bine aceste proprietăți, dacă am extrapola acest API la o pagină de login din zilele noastre, acestea ar putea fi definite astfel:

  • client_eid = name

  • application_id = user

  • secret = password

Preluarea unui token

  • Preluarea unui token se realizează prin operația de POST

  • URL-ul de acces token este: https://{MEDIU}.keez.ro/idp/connect/token

  • De observat proprietatea {MEDIU} din URL, aceasta se va înlocui cu MEDIU pentru care se face apelul:

  • Proprietățile de mai sus (client_eid, application_id, secret) vor fi servite către API sub formă de request body

  • Rezultatul API-ului este de tip JSON, din care se vor extrage informațiile necesare: Vezi Model Autorizare

  • Token-ul are un termen de expirare de 60 minute. Pentru folosirea API-ului este recomandată obținerea unui nou Token atunci cand cel vechi expiră. Vezi: Exemple Autorizare

Atenționare

De remarcat particularitatea adăugării prefixului «app» la valoarea parametrului «application_id» pentru câmpul «client_id». Vezi exemplul

Exemple Autorizare

Preluare Token varianta simplă fără reîmprospătare token (refresh automat la expirare):
  • Această metodă se folosește atunci când se realizează o operație punctuală, cu durată scurtă.

import requests

class TokenService:
    def __init__(self):
        self.token_url = 'https://staging.keez.ro/idp/connect/token'

        self.client_eid = '{RECEIVED_CLIENT_EID}'
        self.application_id = '{RECEIVED_APPLICATION_ID}'
        self.secret = '{RECEIVED_SECRET}'

    def generate_token(self):
        req = requests.post(self.token_url, data={
            'client_id': f'app{self.application_id}',
            'client_secret': self.secret,
            'grant_type': 'client_credentials',
            'scope': 'public-api',
        }, headers={
            'Content-Type': 'application/x-www-form-urlencoded'
        })
        req.raise_for_status()
        return req.json()


if __name__ == '__main__':
    token = TokenService()
    auth_token = token.generate_token()
    print(auth_token)
Preluare Token varianta complexă cu expirare token și refresh automat al token-ului:
  • Este cea mai sigură metodă, deoarece se bazează direct pe monitorizarea timpului de expirare al token-ului

  • De fiecare dată când token-ul expiră, acesta se reîmprospătează

import time
import requests
import python_jwt as jwt


class TokenService:
    def __init__(self):
        self.token_url = 'https://staging.keez.ro/idp/connect/token'

        self.client_eid = '{RECEIVED_CLIENT_EID}'
        self.application_id = '{RECEIVED_APPLICATION_ID}'
        self.secret = '{RECEIVED_SECRET}'

        self.expires = None
        self.token = None
        self.expires = time.gmtime(0)

    def refresh_auth_token(self):
        if self.token_expired():
            self.generate_token()

    def token_expired(self):
        return self.expires < time.gmtime()

    def generate_token(self):
        req = requests.post(self.token_url, data={
            'client_id': f'app{self.application_id}',
            'client_secret': self.secret,
            'grant_type': 'client_credentials',
            'scope': 'public-api',
        }, headers={
            'Content-Type': 'application/x-www-form-urlencoded'
        })
        req.raise_for_status()
        json = req.json()

        self.token = f'{json["token_type"]} {json["access_token"]}'
        (_, claims) = jwt.process_jwt(json['access_token'])
        self.expires = time.gmtime(claims['exp'])

        return


if __name__ == '__main__':
    token = TokenService()
    token.refresh_auth_token()