"""Handle JSON Web Token Encoding & Decoding.""" # Standard Library Imports import datetime # Third Party Imports import jwt # Project Imports from hyperglass.exceptions import RestError async def jwt_decode(payload, secret): """Decode & validate an encoded JSON Web Token (JWT). Arguments: payload {str} -- Raw JWT payload secret {str} -- JWT secret Raises: RestError: Raised if decoded payload is improperly formatted or if the JWT is not able to be decoded. Returns: {str} -- Decoded response payload """ try: decoded = jwt.decode(payload, secret, algorithm="HS256") decoded = decoded["payload"] return decoded except (KeyError, jwt.PyJWTError) as exp: raise RestError(str(exp)) from None async def jwt_encode(payload, secret, duration): """Encode a query to a JSON Web Token (JWT). Arguments: payload {str} -- Stringified JSON request secret {str} -- JWT secret duration {int} -- Number of seconds claim is valid Returns: str -- Encoded request payload """ token = { "payload": payload, "nbf": datetime.datetime.utcnow(), "iat": datetime.datetime.utcnow(), "exp": datetime.datetime.utcnow() + datetime.timedelta(seconds=duration), } encoded = jwt.encode(token, secret, algorithm="HS256").decode("utf-8") return encoded