Source code for aap_client.tokens

"""
Classes and functions that encode, decode and verify JWT tokens

Encoded means encoded using base64, decoded tokens are json files
"""
from jwt import decode, MissingRequiredClaimError

from aap_client.public_keys import load_from_pem, load_from_der


_DEFAULT_CLAIMS = {u'iat', u'exp', u'sub', u'email', u'name', u'nickname'}


[docs]class TokenDecoder(object): # pylint: disable=too-few-public-methods """ Decodes and verifies tokens using an x509 certificate and checking always the same claims. """ def __init__(self, filename, required_claims=None): """ Args: filename: relative path to the file that contains the x509 certificate. required_claims: list of string with the claims that need to be present in the tokens. """ if required_claims is None: required_claims = [] self._required_claims = required_claims try: key = load_from_pem(filename) except ValueError: key = load_from_der(filename) self._key = key
[docs] def decode(self, serialized_token): """ Decodes and verifies a token using a determined audience""" return verify_token(serialized_token, self._key, required_claims=self._required_claims)
[docs]def verify_token(serialized_token, public_key, required_claims=None): """ Decodes and verifies a token given a certificate, the obligatory claims and a determined audience. """ if required_claims is None: required_claims = [] required_claims = set(required_claims).union(_DEFAULT_CLAIMS) payload = decode(serialized_token, public_key, algorithms=[u'RS256']) for claim in required_claims: if payload.get(claim) is None: raise MissingRequiredClaimError(claim) return payload