diff --git a/lti_consumer/lti_1p3/consumer.py b/lti_consumer/lti_1p3/consumer.py index c79eb96eb396b2282d279a1f6098abc2c9de9a5e..9c3e09d010df5a346a85bb85742f6b11f22a701e 100644 --- a/lti_consumer/lti_1p3/consumer.py +++ b/lti_consumer/lti_1p3/consumer.py @@ -1,6 +1,8 @@ """ LTI 1.3 Consumer implementation """ +import json +import time from six.moves.urllib.parse import urlencode from . import exceptions @@ -278,6 +280,10 @@ class LtiConsumer1p3: return self.key_handler.get_public_jwk() + public_keys = jwk.KEYS() + public_keys.append(self.jwk) + return json.loads(public_keys.dump_jwks()) + def access_token(self, token_request_data): """ Validate request and return JWT access token. @@ -344,3 +350,19 @@ class LtiConsumer1p3: "expires_in": 3600, "scope": scopes_str } + + def _validate_preflight_response(self, response): + """ + Validates a preflight response to be used in a launch request + + Raises ValueError in case of validation failure + + :param response: the preflight response to be validated + """ + try: + assert response.get("nonce") + assert response.get("state") + assert response.get("client_id") == self.client_id + assert response.get("redirect_uri") == self.launch_url + except AssertionError as e: + raise ValueError("Preflight reponse failed validation")