def dispatch(self, request, *args, **kwargs): self.course_api_enabled = switch_is_active('enable_course_api') if self.course_api_enabled and request.user.is_authenticated: self.access_token = settings.COURSE_API_KEY or EdxRestApiClient.get_and_cache_jwt_oauth_access_token( settings.BACKEND_SERVICE_EDX_OAUTH2_PROVIDER_URL, settings.BACKEND_SERVICE_EDX_OAUTH2_KEY, settings.BACKEND_SERVICE_EDX_OAUTH2_SECRET, )[0] self.course_api = CourseStructureApiClient(settings.COURSE_API_URL, self.access_token) return super(CourseAPIMixin, self).dispatch(request, *args, **kwargs)
def test_shared_client_credential_jwt_access_token(self): """ Test that get_and_cache_jwt_oauth_access_token returns the same access token used by the OAuthAPIClient. """ body = {'access_token': "my-token", 'expires_in': 1000} now = datetime.datetime.utcnow() expected_return = ('my-token', now + datetime.timedelta(seconds=1000)) with freeze_time(now): self._mock_auth_api(OAUTH_URL, 200, body=body) actual_return = EdxRestApiClient.get_and_cache_jwt_oauth_access_token( OAUTH_URL, 'client_id', 'client_secret') self.assertEqual(actual_return, expected_return) self.assertEqual(len(responses.calls), 1) # ensure OAuthAPIClient uses the same cached auth token without re-requesting the token from the server oauth_client = OAuthAPIClient(OAUTH_URL, 'client_id', 'client_secret') self._mock_auth_api(URL, 200, {'status': 'ok'}) oauth_client.post(URL, data={'test': 'ok'}) self.assertEqual(oauth_client.auth.token, actual_return[0]) self.assertEqual(len(responses.calls), 2) self.assertEqual(URL, responses.calls[1][0].url)