Source code for arxiv.users.auth.tokens
"""
Functions for working with authn/z tokens on user/client requests.
Encrypted JSON Web Tokens can be used inside the arXiv system to securely
convey authn/z information about each request. These tokens will usually be
generated by the :mod:`authorizer` in response to an
authorization subrequest from the web server, and contain information about
the identity of the user and/or client as well as authorization information
(e.g. :mod:`arxiv.users.auth.scopes`).
It is essential that these JWTs are encrypted and decrypted precisely the same
way in all arXiv services, so we include these routines here for convenience.
"""
import jwt
from . import exceptions
from .. import domain
[docs]def encode(session: domain.Session, secret: str) -> str:
"""
Encode session information as an encrypted JWT.
Parameters
----------
session : :class:`.domain.Session`
User or client session data, including authorization information.
secret : str
A secret key used to encrypt the token. This secret is required to
decode the token later on (e.g. in the application handling the
request).
Returns
-------
str
An encrypted JWT.
"""
return jwt.encode(domain.to_dict(session), secret).decode('ascii')
[docs]def decode(token: str, secret: str) -> domain.Session:
"""Decode an auth token to access session information."""
try:
data = dict(jwt.decode(token, secret, algorithms=['HS256']))
except jwt.exceptions.DecodeError as e: # type: ignore
raise exceptions.InvalidToken('Not a valid token') from e
session: domain.Session = domain.from_dict(domain.Session, data)
return session