示例#1
0
    def _get_access_token(self):
        consumer = self._create_single_consumer()
        consumer_id = consumer['id']
        consumer_secret = consumer['secret']
        consumer = {'key': consumer_id, 'secret': consumer_secret}

        url, headers = self._create_request_token(consumer, self.project_id)
        content = self.post(
            url,
            headers=headers,
            response_content_type='application/x-www-form-urlencoded')
        credentials = self._urllib_parse_qs_text_keys(content.result)
        request_key = credentials['oauth_token'][0]
        request_secret = credentials['oauth_token_secret'][0]
        request_token = oauth1.Token(request_key, request_secret)

        url = self._authorize_request_token(request_key)
        body = {'roles': [{'id': self.role_id}]}
        resp = self.put(url, body=body, expected_status=http.client.OK)
        verifier = resp.result['token']['oauth_verifier']

        request_token.set_verifier(verifier)
        url, headers = self._create_access_token(consumer, request_token)
        content = self.post(
            url,
            headers=headers,
            response_content_type='application/x-www-form-urlencoded')
        credentials = self._urllib_parse_qs_text_keys(content.result)
        access_key = credentials['oauth_token'][0]
        access_secret = credentials['oauth_token_secret'][0]
        access_token = oauth1.Token(access_key, access_secret)

        url, headers, body = self._get_oauth_token(consumer, access_token)
        content = self.post(url, headers=headers, body=body)
        return access_key, content.headers['X-Subject-Token']
示例#2
0
    def test_expired_creating_keystone_token(self):
        with freezegun.freeze_time(datetime.datetime.utcnow()) as frozen_time:
            self.config_fixture.config(group='oauth1', access_token_duration=1)

            consumer = self._create_single_consumer()
            consumer_id = consumer['id']
            consumer_secret = consumer['secret']
            self.consumer = {'key': consumer_id, 'secret': consumer_secret}
            self.assertIsNotNone(self.consumer['key'])

            url, headers = self._create_request_token(self.consumer,
                                                      self.project_id)
            content = self.post(
                url,
                headers=headers,
                response_content_type='application/x-www-form-urlencoded')
            credentials = _urllib_parse_qs_text_keys(content.result)
            request_key = credentials['oauth_token'][0]
            request_secret = credentials['oauth_token_secret'][0]
            self.request_token = oauth1.Token(request_key, request_secret)
            self.assertIsNotNone(self.request_token.key)

            url = self._authorize_request_token(request_key)
            body = {'roles': [{'id': self.role_id}]}
            resp = self.put(url, body=body, expected_status=http_client.OK)
            self.verifier = resp.result['token']['oauth_verifier']

            self.request_token.set_verifier(self.verifier)
            url, headers = self._create_access_token(self.consumer,
                                                     self.request_token)
            content = self.post(
                url,
                headers=headers,
                response_content_type='application/x-www-form-urlencoded')
            credentials = _urllib_parse_qs_text_keys(content.result)
            access_key = credentials['oauth_token'][0]
            access_secret = credentials['oauth_token_secret'][0]
            self.access_token = oauth1.Token(access_key, access_secret)
            self.assertIsNotNone(self.access_token.key)

            url, headers, body = self._get_oauth_token(self.consumer,
                                                       self.access_token)
            frozen_time.tick(delta=datetime.timedelta(
                seconds=CONF.oauth1.access_token_duration + 1))
            self.post(url,
                      headers=headers,
                      body=body,
                      expected_status=http_client.UNAUTHORIZED)
示例#3
0
    def test_bad_verifier(self):
        consumer = self._create_single_consumer()
        consumer_id = consumer['id']
        consumer_secret = consumer['secret']
        consumer = {'key': consumer_id, 'secret': consumer_secret}

        url, headers = self._create_request_token(consumer, self.project_id)
        content = self.post(
            url, headers=headers,
            response_content_type='application/x-www-urlformencoded')
        credentials = _urllib_parse_qs_text_keys(content.result)
        request_key = credentials['oauth_token'][0]
        request_secret = credentials['oauth_token_secret'][0]
        request_token = oauth1.Token(request_key, request_secret)

        url = self._authorize_request_token(request_key)
        body = {'roles': [{'id': self.role_id}]}
        resp = self.put(url, body=body, expected_status=http_client.OK)
        verifier = resp.result['token']['oauth_verifier']
        self.assertIsNotNone(verifier)

        request_token.set_verifier(uuid.uuid4().hex)
        url, headers = self._create_access_token(consumer, request_token)
        self.post(url, headers=headers,
                  expected_status=http_client.UNAUTHORIZED)
示例#4
0
    def test_no_authorizing_user_id(self):
        consumer = self._create_single_consumer()
        consumer_id = consumer['id']
        consumer_secret = consumer['secret']
        consumer = {'key': consumer_id, 'secret': consumer_secret}

        url, headers = self._create_request_token(consumer, self.project_id)
        content = self.post(
            url,
            headers=headers,
            response_content_type='application/x-www-form-urlencoded')
        credentials = _urllib_parse_qs_text_keys(content.result)
        request_key = credentials['oauth_token'][0]
        request_secret = credentials['oauth_token_secret'][0]
        request_token = oauth1.Token(request_key, request_secret)

        url = self._authorize_request_token(request_key)
        body = {'roles': [{'id': self.role_id}]}
        resp = self.put(url, body=body, expected_status=http_client.OK)
        verifier = resp.result['token']['oauth_verifier']
        request_token.set_verifier(verifier)
        request_token_created = self.oauth_api.get_request_token(
            request_key.decode('utf-8'))
        request_token_created.update({'authorizing_user_id': ''})
        # Update the request token that is created instead of mocking
        # the whole token object to focus on what's we want to test
        # here and avoid any other factors that will result in the same
        # exception.
        with mock.patch.object(self.oauth_api,
                               'get_request_token') as mock_token:
            mock_token.return_value = request_token_created
            url, headers = self._create_access_token(consumer, request_token)
            self.post(url,
                      headers=headers,
                      expected_status=http_client.UNAUTHORIZED)
示例#5
0
    def test_bad_verifier(self):
        self.config_fixture.config(debug=True, insecure_debug=True)
        consumer = self._create_single_consumer()
        consumer_id = consumer['id']
        consumer_secret = consumer['secret']
        consumer = {'key': consumer_id, 'secret': consumer_secret}

        url, headers = self._create_request_token(consumer, self.project_id)
        content = self.post(
            url,
            headers=headers,
            response_content_type='application/x-www-form-urlencoded')
        credentials = _urllib_parse_qs_text_keys(content.result)
        request_key = credentials['oauth_token'][0]
        request_secret = credentials['oauth_token_secret'][0]
        request_token = oauth1.Token(request_key, request_secret)

        url = self._authorize_request_token(request_key)
        body = {'roles': [{'id': self.role_id}]}
        resp = self.put(url, body=body, expected_status=http_client.OK)
        verifier = resp.result['token']['oauth_verifier']
        self.assertIsNotNone(verifier)

        request_token.set_verifier(uuid.uuid4().hex)
        url, headers = self._create_access_token(consumer, request_token)
        resp = self.post(url,
                         headers=headers,
                         expected_status=http_client.BAD_REQUEST)
        resp_data = jsonutils.loads(resp.body)
        self.assertIn('Validation failed with errors',
                      resp_data.get('error', {}).get('message'))
示例#6
0
    def test_oauth_flow(self):
        consumer = self._create_single_consumer()
        consumer_id = consumer['id']
        consumer_secret = consumer['secret']
        self.consumer = {'key': consumer_id, 'secret': consumer_secret}
        self.assertIsNotNone(self.consumer['secret'])

        url, headers = self._create_request_token(self.consumer,
                                                  self.project_id)
        content = self.post(
            url,
            headers=headers,
            response_content_type='application/x-www-form-urlencoded')
        credentials = _urllib_parse_qs_text_keys(content.result)
        request_key = credentials['oauth_token'][0]
        request_secret = credentials['oauth_token_secret'][0]
        self.request_token = oauth1.Token(request_key, request_secret)
        self.assertIsNotNone(self.request_token.key)

        url = self._authorize_request_token(request_key)
        body = {'roles': [{'id': self.role_id}]}
        resp = self.put(url, body=body, expected_status=http_client.OK)
        self.verifier = resp.result['token']['oauth_verifier']
        self.assertTrue(all(i in base.VERIFIER_CHARS for i in self.verifier))
        self.assertEqual(8, len(self.verifier))

        self.request_token.set_verifier(self.verifier)
        url, headers = self._create_access_token(self.consumer,
                                                 self.request_token)
        content = self.post(
            url,
            headers=headers,
            response_content_type='application/x-www-form-urlencoded')
        credentials = _urllib_parse_qs_text_keys(content.result)
        access_key = credentials['oauth_token'][0]
        access_secret = credentials['oauth_token_secret'][0]
        self.access_token = oauth1.Token(access_key, access_secret)
        self.assertIsNotNone(self.access_token.key)

        url, headers, body = self._get_oauth_token(self.consumer,
                                                   self.access_token)
        content = self.post(url, headers=headers, body=body)
        self.keystone_token_id = content.headers['X-Subject-Token']
        self.keystone_token = content.result['token']
        self.assertIsNotNone(self.keystone_token_id)
示例#7
0
    def test_expired_creating_keystone_token(self):
        self.config_fixture.config(group='oauth1', access_token_duration=-1)
        consumer = self._create_single_consumer()
        consumer_id = consumer['id']
        consumer_secret = consumer['secret']
        self.consumer = {'key': consumer_id, 'secret': consumer_secret}
        self.assertIsNotNone(self.consumer['key'])

        url, headers = self._create_request_token(self.consumer,
                                                  self.project_id)
        content = self.post(
            url,
            headers=headers,
            response_content_type='application/x-www-urlformencoded')
        credentials = urllib.parse.parse_qs(content.result)
        request_key = credentials['oauth_token'][0]
        request_secret = credentials['oauth_token_secret'][0]
        self.request_token = oauth1.Token(request_key, request_secret)
        self.assertIsNotNone(self.request_token.key)

        url = self._authorize_request_token(request_key)
        body = {'roles': [{'id': self.role_id}]}
        resp = self.put(url, body=body, expected_status=http_client.OK)
        self.verifier = resp.result['token']['oauth_verifier']

        self.request_token.set_verifier(self.verifier)
        url, headers = self._create_access_token(self.consumer,
                                                 self.request_token)
        content = self.post(
            url,
            headers=headers,
            response_content_type='application/x-www-urlformencoded')
        credentials = urllib.parse.parse_qs(content.result)
        access_key = credentials['oauth_token'][0]
        access_secret = credentials['oauth_token_secret'][0]
        self.access_token = oauth1.Token(access_key, access_secret)
        self.assertIsNotNone(self.access_token.key)

        url, headers, body = self._get_oauth_token(self.consumer,
                                                   self.access_token)
        self.post(url,
                  headers=headers,
                  body=body,
                  expected_status=http_client.UNAUTHORIZED)
示例#8
0
    def _approve_request_token_url(self):
        consumer = self._create_single_consumer()
        consumer_id = consumer['id']
        consumer_secret = consumer['secret']
        self.consumer = {'key': consumer_id, 'secret': consumer_secret}
        self.assertIsNotNone(self.consumer['secret'])

        url, headers = self._create_request_token(self.consumer,
                                                  self.project_id)
        content = self.post(
            url, headers=headers,
            response_content_type='application/x-www-urlformencoded')
        credentials = _urllib_parse_qs_text_keys(content.result)
        request_key = credentials['oauth_token'][0]
        request_secret = credentials['oauth_token_secret'][0]
        self.request_token = oauth1.Token(request_key, request_secret)
        self.assertIsNotNone(self.request_token.key)

        url = self._authorize_request_token(request_key)

        return url
    def test_expired_authorizing_request_token(self):
        self.config_fixture.config(group='oauth1', request_token_duration=-1)

        consumer = self._create_single_consumer()
        consumer_id = consumer['id']
        consumer_secret = consumer['secret']
        self.consumer = {'key': consumer_id, 'secret': consumer_secret}
        self.assertIsNotNone(self.consumer['key'])

        url, headers = self._create_request_token(self.consumer,
                                                  self.project_id)
        content = self.post(
            url, headers=headers,
            response_content_type='application/x-www-form-urlencoded')
        credentials = _urllib_parse_qs_text_keys(content.result)
        request_key = credentials['oauth_token'][0]
        request_secret = credentials['oauth_token_secret'][0]
        self.request_token = oauth1.Token(request_key, request_secret)
        self.assertIsNotNone(self.request_token.key)

        url = self._authorize_request_token(request_key)
        body = {'roles': [{'id': self.role_id}]}
        self.put(url, body=body, expected_status=http_client.UNAUTHORIZED)
示例#10
0
    def test_oauth_flow_notifications(self):
        """Test to ensure notifications are sent for oauth tokens.

        This test is very similar to test_oauth_flow, however
        there are additional checks in this test for ensuring that
        notifications for request token creation, and access token
        creation/deletion are emitted.
        """
        consumer = self._create_single_consumer()
        consumer_id = consumer['id']
        consumer_secret = consumer['secret']
        self.consumer = {'key': consumer_id, 'secret': consumer_secret}
        self.assertIsNotNone(self.consumer['secret'])

        url, headers = self._create_request_token(self.consumer,
                                                  self.project_id)
        content = self.post(
            url, headers=headers,
            response_content_type='application/x-www-urlformencoded')
        credentials = _urllib_parse_qs_text_keys(content.result)
        request_key = credentials['oauth_token'][0]
        request_secret = credentials['oauth_token_secret'][0]
        self.request_token = oauth1.Token(request_key, request_secret)
        self.assertIsNotNone(self.request_token.key)

        request_key_string = request_key.decode()
        # Test to ensure the create request token notification is sent
        self._assert_notify_sent(request_key_string,
                                 test_notifications.CREATED_OPERATION,
                                 'OS-OAUTH1:request_token')
        self._assert_last_audit(request_key_string,
                                test_notifications.CREATED_OPERATION,
                                'OS-OAUTH1:request_token',
                                cadftaxonomy.SECURITY_CREDENTIAL)

        url = self._authorize_request_token(request_key)
        body = {'roles': [{'id': self.role_id}]}
        resp = self.put(url, body=body, expected_status=http_client.OK)
        self.verifier = resp.result['token']['oauth_verifier']
        self.assertTrue(all(i in base.VERIFIER_CHARS for i in self.verifier))
        self.assertEqual(8, len(self.verifier))

        self.request_token.set_verifier(self.verifier)
        url, headers = self._create_access_token(self.consumer,
                                                 self.request_token)
        content = self.post(
            url, headers=headers,
            response_content_type='application/x-www-urlformencoded')
        credentials = _urllib_parse_qs_text_keys(content.result)
        access_key = credentials['oauth_token'][0]
        access_secret = credentials['oauth_token_secret'][0]
        self.access_token = oauth1.Token(access_key, access_secret)
        self.assertIsNotNone(self.access_token.key)

        access_key_string = access_key.decode()
        # Test to ensure the create access token notification is sent
        self._assert_notify_sent(access_key_string,
                                 test_notifications.CREATED_OPERATION,
                                 'OS-OAUTH1:access_token')
        self._assert_last_audit(access_key_string,
                                test_notifications.CREATED_OPERATION,
                                'OS-OAUTH1:access_token',
                                cadftaxonomy.SECURITY_CREDENTIAL)

        resp = self.delete('/users/%(user)s/OS-OAUTH1/access_tokens/%(auth)s'
                           % {'user': self.user_id,
                              'auth': self.access_token.key.decode()})
        self.assertResponseStatus(resp, http_client.NO_CONTENT)

        # Test to ensure the delete access token notification is sent
        self._assert_notify_sent(access_key_string,
                                 test_notifications.DELETED_OPERATION,
                                 'OS-OAUTH1:access_token')
        self._assert_last_audit(access_key_string,
                                test_notifications.DELETED_OPERATION,
                                'OS-OAUTH1:access_token',
                                cadftaxonomy.SECURITY_CREDENTIAL)
示例#11
0
    def test_validate_access_token_request_failed(self):
        self.config_fixture.config(debug=True, insecure_debug=True)
        consumer = self._create_single_consumer()
        consumer_id = consumer['id']
        consumer_secret = consumer['secret']
        consumer = {'key': consumer_id, 'secret': consumer_secret}

        url, headers = self._create_request_token(consumer, self.project_id)
        content = self.post(
            url,
            headers=headers,
            response_content_type='application/x-www-form-urlencoded')
        credentials = _urllib_parse_qs_text_keys(content.result)
        request_key = credentials['oauth_token'][0]
        request_secret = credentials['oauth_token_secret'][0]
        request_token = oauth1.Token(request_key, request_secret)

        url = self._authorize_request_token(request_key)
        body = {'roles': [{'id': self.role_id}]}
        resp = self.put(url, body=body, expected_status=http_client.OK)
        verifier = resp.result['token']['oauth_verifier']
        request_token.set_verifier(verifier)

        # 1. Invalid base url.
        # Update the base url, so it will fail to validate the signature.
        base_url = 'http://localhost/identity_admin/v3'
        url, headers = self._create_access_token(consumer,
                                                 request_token,
                                                 base_url=base_url)
        resp = self.post(url,
                         headers=headers,
                         expected_status=http_client.UNAUTHORIZED)
        resp_data = jsonutils.loads(resp.body)
        self.assertIn('Invalid signature',
                      resp_data.get('error', {}).get('message'))

        # 2. Invalid base url scheme.
        # Update the base url scheme, so it will fail to validate signature.
        bad_url_scheme = self._switch_baseurl_scheme()
        url, headers = self._create_access_token(consumer,
                                                 request_token,
                                                 base_url=bad_url_scheme)
        resp = self.post(url,
                         headers=headers,
                         expected_status=http_client.UNAUTHORIZED)
        resp_data = jsonutils.loads(resp.body)
        self.assertIn('Invalid signature',
                      resp_data.get('error', {}).get('message'))

        # 3. Invalid signature.
        # Update the secret, so it will fail to validate the signature.
        consumer.update({'secret': uuid.uuid4().hex})
        url, headers = self._create_access_token(consumer, request_token)
        resp = self.post(url,
                         headers=headers,
                         expected_status=http_client.UNAUTHORIZED)
        resp_data = jsonutils.loads(resp.body)
        self.assertIn('Invalid signature',
                      resp_data.get('error', {}).get('message'))

        # 4. Invalid verifier.
        # Even though the verifier is well formatted, it is not verifier
        # that is stored in the backend, this is different with the testcase
        # above `test_bad_verifier` where it test that `verifier` is not
        # well formatted.
        verifier = ''.join(random.SystemRandom().sample(
            base.VERIFIER_CHARS, 8))
        request_token.set_verifier(verifier)
        url, headers = self._create_access_token(consumer, request_token)
        resp = self.post(url,
                         headers=headers,
                         expected_status=http_client.UNAUTHORIZED)
        resp_data = jsonutils.loads(resp.body)
        self.assertIn('Provided verifier',
                      resp_data.get('error', {}).get('message'))

        # 5. The provided consumer does not exist.
        consumer.update({'key': uuid.uuid4().hex})
        url, headers = self._create_access_token(consumer, request_token)
        resp = self.post(url,
                         headers=headers,
                         expected_status=http_client.UNAUTHORIZED)
        resp_data = jsonutils.loads(resp.body)
        self.assertIn('Provided consumer does not exist',
                      resp_data.get('error', {}).get('message'))

        # 6. The consumer key provided does not match stored consumer key.
        consumer2 = self._create_single_consumer()
        consumer.update({'key': consumer2['id']})
        url, headers = self._create_access_token(consumer, request_token)
        resp = self.post(url,
                         headers=headers,
                         expected_status=http_client.UNAUTHORIZED)
        resp_data = jsonutils.loads(resp.body)
        self.assertIn('Provided consumer key',
                      resp_data.get('error', {}).get('message'))