Ejemplo n.º 1
0
    def __init__(self, channel_config):
        self.config = channel_config
        self.auth_use_case = None

        if self.config.get("ChannelAuth") == "Cognito/JWT":
            self.auth_use_case = GetCognitoAuthUseCase(
                **self.config["ChannelAuthDetails"])
Ejemplo n.º 2
0
 def test_get_jwt__when_token_exist_and_not_expired__should_return_token(
         self):
     use_case = GetCognitoAuthUseCase('client_id', 'client_secret', 'scope',
                                      'https://token_endpoint.com')
     use_case._jwt = 'existing cached token'
     use_case._jwt_expires_at = datetime.datetime(2020, 7, 6, 12, 17)
     assert use_case.get_jwt() == 'existing cached token'
Ejemplo n.º 3
0
 def test_get_jwt__when_token_expired__should_issue_new_token_and_return_it(
         self):
     self.mocked_responses.add(responses.POST,
                               'https://token_endpoint.com',
                               json={
                                   'expires_in': 100,
                                   'access_token': 'new token'
                               })
     use_case = GetCognitoAuthUseCase('client_id', 'client_secret', 'scope',
                                      'https://token_endpoint.com')
     use_case._jwt = 'old token'
     use_case._jwt_expires_at = datetime.datetime(2020, 7, 6, 11, 16)
     assert use_case.get_jwt() == 'new token'
Ejemplo n.º 4
0
class RequestChannelAPIUseCase:
    CHANNEL_API_GET_MESSAGE_ENDPOINT = '/messages'
    CHANNEL_API_SUBSCRIBE_BY_JURISDICTION_ENDPOINT = '/messages/subscriptions/by_jurisdiction'

    def __init__(self, channel_config):
        self.config = channel_config
        self.auth_use_case = None

        if self.config.get("ChannelAuth") == "Cognito/JWT":
            self.auth_use_case = GetCognitoAuthUseCase(
                **self.config["ChannelAuthDetails"])

    def get_message(self, message_id):
        endpoint = '%s/%s' % (self.CHANNEL_API_GET_MESSAGE_ENDPOINT,
                              message_id)
        response = self.get(endpoint)
        if response.status_code != 200:
            raise ChannelApiFailure(
                "Could not get message from Channel API, response:%s" %
                response)
        return response.json()

    def subscribe_by_jurisdiction(self, callback_url, country, secret=''):
        if not (callback_url and country):
            raise InvalidSubscriptionParameters
        params = {
            'hub.mode': 'subscribe',
            'hub.callback': callback_url,
            'hub.topic': country,
            'hub.secret': secret
        }
        endpoint = self.CHANNEL_API_SUBSCRIBE_BY_JURISDICTION_ENDPOINT
        response = self.post(endpoint, data=params)
        if not response.status_code == 202:
            raise SubscriptionFailure("Channel returned bad response, %r" %
                                      response.content)

    def get(self, endpoint):
        url = self.get_url(endpoint)
        return requests.get(url, headers=self.get_headers())

    def post(self, endpoint, data=None, json=None):
        url = self.get_url(endpoint)
        logger.debug('Sending POST to %s, data: %r, json: %s', url, data, json)
        return requests.post(url,
                             data=data,
                             json=json,
                             headers=self.get_headers())

    def get_headers(self):
        headers = {}
        if self.auth_use_case:
            token = self.auth_use_case.get_jwt()
            headers["Authorization"] = f"Bearer {token}"

        headers.update(**headers)
        return headers

    def get_url(self, endpoint):
        return urljoin(self.config['ChannelUrl'], endpoint)