From bafff0bc9dee6b4bfbd77d3c376c03bfa86e7d91 Mon Sep 17 00:00:00 2001 From: jtroussard Date: Mon, 17 Feb 2020 14:54:40 -0500 Subject: [PATCH 1/6] removed outdated linkedin compliance fixes --- HISTORY.rst | 1 + docs/examples/linkedin.rst | 24 +++++++----- .../compliance_fixes/__init__.py | 1 - .../compliance_fixes/linkedin.py | 21 ----------- tests/test_compliance_fixes.py | 37 ------------------- 5 files changed, 15 insertions(+), 69 deletions(-) delete mode 100644 requests_oauthlib/compliance_fixes/linkedin.py diff --git a/HISTORY.rst b/HISTORY.rst index e92ab47b..40989d2c 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -5,6 +5,7 @@ UNRELEASED ++++++++++ - Add initial support for OAuth Mutual TLS (draft-ietf-oauth-mtls) +- Removed outdated LinkedIn Compliance Fixes v1.3.0 (6 November 2019) ++++++++++++++++++++++++ diff --git a/docs/examples/linkedin.rst b/docs/examples/linkedin.rst index a4009e40..49defda4 100644 --- a/docs/examples/linkedin.rst +++ b/docs/examples/linkedin.rst @@ -13,27 +13,31 @@ command line interactive example below. >>> client_id = '' >>> client_secret = '' + >>> # LinkedIn OAuth2 requests require scope and redirect_url parameters. + >>> # Ensure these values match the auth values in your LinkedIn App + >>> # (see auth tab on LinkedIn Developer page) + >>> scope = ['r_liteprofile'] + >>> redirect_url = 'http://127.0.0.1' + >>> # OAuth endpoints given in the LinkedIn API documentation - >>> authorization_base_url = 'https://www.linkedin.com/uas/oauth2/authorization' - >>> token_url = 'https://www.linkedin.com/uas/oauth2/accessToken' + >>> authorization_base_url = 'https://www.linkedin.com/oauth/v2/authorization' + >>> token_url = 'https://www.linkedin.com/oauth/v2/accessToken' >>> from requests_oauthlib import OAuth2Session - >>> from requests_oauthlib.compliance_fixes import linkedin_compliance_fix >>> linkedin = OAuth2Session(client_id, redirect_uri='http://127.0.0.1') - >>> linkedin = linkedin_compliance_fix(linkedin) >>> # Redirect user to LinkedIn for authorization >>> authorization_url, state = linkedin.authorization_url(authorization_base_url) - >>> print 'Please go here and authorize,', authorization_url + >>> print("Please go here and authorize, {}").format(authorization_url)) >>> # Get the authorization verifier code from the callback url - >>> redirect_response = raw_input('Paste the full redirect URL here:') + >>> redirect_response = input('Paste the full redirect URL here:') >>> # Fetch the access token - >>> linkedin.fetch_token(token_url, client_secret=client_secret, - ... authorization_response=redirect_response) + >>> linkedin.fetch_token(token_url,client_secret=client_secret, + ... include_client_id=True,authorization_response=redirect_response) >>> # Fetch a protected resource, i.e. user profile - >>> r = linkedin.get('https://api.linkedin.com/v1/people/~') - >>> print r.content + >>> r = linkedin.get('https://api.linkedin.com/v2/me') + >>> print(r.content) diff --git a/requests_oauthlib/compliance_fixes/__init__.py b/requests_oauthlib/compliance_fixes/__init__.py index 02fa5120..8d3aba1c 100644 --- a/requests_oauthlib/compliance_fixes/__init__.py +++ b/requests_oauthlib/compliance_fixes/__init__.py @@ -2,7 +2,6 @@ from .facebook import facebook_compliance_fix from .fitbit import fitbit_compliance_fix -from .linkedin import linkedin_compliance_fix from .slack import slack_compliance_fix from .instagram import instagram_compliance_fix from .mailchimp import mailchimp_compliance_fix diff --git a/requests_oauthlib/compliance_fixes/linkedin.py b/requests_oauthlib/compliance_fixes/linkedin.py deleted file mode 100644 index cd5b4ace..00000000 --- a/requests_oauthlib/compliance_fixes/linkedin.py +++ /dev/null @@ -1,21 +0,0 @@ -from json import loads, dumps - -from oauthlib.common import add_params_to_uri, to_unicode - - -def linkedin_compliance_fix(session): - def _missing_token_type(r): - token = loads(r.text) - token["token_type"] = "Bearer" - r._content = to_unicode(dumps(token)).encode("UTF-8") - return r - - def _non_compliant_param_name(url, headers, data): - token = [("oauth2_access_token", session.access_token)] - url = add_params_to_uri(url, token) - return url, headers, data - - session._client.default_token_placement = "query" - session.register_compliance_hook("access_token_response", _missing_token_type) - session.register_compliance_hook("protected_request", _non_compliant_param_name) - return session diff --git a/tests/test_compliance_fixes.py b/tests/test_compliance_fixes.py index c93e2b23..22a4a54a 100644 --- a/tests/test_compliance_fixes.py +++ b/tests/test_compliance_fixes.py @@ -99,43 +99,6 @@ def test_refresh_token(self): self.assertEqual(token["refresh_token"], "refresh") -class LinkedInComplianceFixTest(TestCase): - def setUp(self): - mocker = requests_mock.Mocker() - mocker.post( - "https://www.linkedin.com/uas/oauth2/accessToken", - json={"access_token": "linkedin"}, - ) - mocker.post( - "https://api.linkedin.com/v1/people/~/shares", - status_code=201, - json={ - "updateKey": "UPDATE-3346389-595113200", - "updateUrl": "https://www.linkedin.com/updates?discuss=abc&scope=xyz", - }, - ) - mocker.start() - self.addCleanup(mocker.stop) - - linkedin = OAuth2Session("someclientid", redirect_uri="https://i.b") - self.session = linkedin_compliance_fix(linkedin) - - def test_fetch_access_token(self): - token = self.session.fetch_token( - "https://www.linkedin.com/uas/oauth2/accessToken", - client_secret="someclientsecret", - authorization_response="https://i.b/?code=hello", - ) - self.assertEqual(token, {"access_token": "linkedin", "token_type": "Bearer"}) - - def test_protected_request(self): - self.session.token = {"access_token": "dummy-access-token"} - response = self.session.post("https://api.linkedin.com/v1/people/~/shares") - url = response.request.url - query = parse_qs(urlparse(url).query) - self.assertEqual(query["oauth2_access_token"], ["dummy-access-token"]) - - class MailChimpComplianceFixTest(TestCase): def setUp(self): mocker = requests_mock.Mocker() From b5918c515f4d71af9c0fb2120f8dd8640776348c Mon Sep 17 00:00:00 2001 From: jtroussard Date: Mon, 17 Feb 2020 15:17:29 -0500 Subject: [PATCH 2/6] removed outdated linkedin compliance fixes - linkedin example --- docs/examples/linkedin.rst | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/docs/examples/linkedin.rst b/docs/examples/linkedin.rst index 49defda4..9279b5fe 100644 --- a/docs/examples/linkedin.rst +++ b/docs/examples/linkedin.rst @@ -9,6 +9,13 @@ command line interactive example below. .. code-block:: pycon + >>> # Imports + >>> import os + >>> from requests_oauthlib import OAuth2Session + + >>> # Set environment variables + >>> os.environ['OAUTHLIB_INSECURE_TRANSPORT'] = '1' + >>> # Credentials you get from registering a new application >>> client_id = '' >>> client_secret = '' @@ -23,20 +30,17 @@ command line interactive example below. >>> authorization_base_url = 'https://www.linkedin.com/oauth/v2/authorization' >>> token_url = 'https://www.linkedin.com/oauth/v2/accessToken' - >>> from requests_oauthlib import OAuth2Session - - >>> linkedin = OAuth2Session(client_id, redirect_uri='http://127.0.0.1') + >>> linkedin = OAuth2Session(client_id, redirect_uri='http://127.0.0.1', scope=scope) >>> # Redirect user to LinkedIn for authorization >>> authorization_url, state = linkedin.authorization_url(authorization_base_url) - >>> print("Please go here and authorize, {}").format(authorization_url)) + >>> print("Please go here and authorize, {}".format(authorization_url)) >>> # Get the authorization verifier code from the callback url >>> redirect_response = input('Paste the full redirect URL here:') >>> # Fetch the access token - >>> linkedin.fetch_token(token_url,client_secret=client_secret, - ... include_client_id=True,authorization_response=redirect_response) + >>> linkedin.fetch_token(token_url,client_secret=client_secret,include_client_id=True,authorization_response=redirect_response) >>> # Fetch a protected resource, i.e. user profile >>> r = linkedin.get('https://api.linkedin.com/v2/me') From 0ee5358b2289f9af9d189ebc19089730286492bd Mon Sep 17 00:00:00 2001 From: jtroussard Date: Mon, 17 Feb 2020 15:25:19 -0500 Subject: [PATCH 3/6] removed outdated linkedin compliance fixes - test compliance import --- tests/test_compliance_fixes.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/test_compliance_fixes.py b/tests/test_compliance_fixes.py index 22a4a54a..e03ec3e5 100644 --- a/tests/test_compliance_fixes.py +++ b/tests/test_compliance_fixes.py @@ -14,7 +14,6 @@ from requests_oauthlib import OAuth2Session from requests_oauthlib.compliance_fixes import facebook_compliance_fix from requests_oauthlib.compliance_fixes import fitbit_compliance_fix -from requests_oauthlib.compliance_fixes import linkedin_compliance_fix from requests_oauthlib.compliance_fixes import mailchimp_compliance_fix from requests_oauthlib.compliance_fixes import weibo_compliance_fix from requests_oauthlib.compliance_fixes import slack_compliance_fix From b390aae17e1d853fd5e7ea053d38de02ec5c9dba Mon Sep 17 00:00:00 2001 From: Jacques Troussard Date: Mon, 17 Feb 2020 15:45:15 -0500 Subject: [PATCH 4/6] Update docs/examples/linkedin.rst First I'm seeing f strings. I've always been happy with format method, but I'll check the docs and give these a whirl. Co-Authored-By: David Baumgold --- docs/examples/linkedin.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/examples/linkedin.rst b/docs/examples/linkedin.rst index 9279b5fe..2140f773 100644 --- a/docs/examples/linkedin.rst +++ b/docs/examples/linkedin.rst @@ -34,7 +34,7 @@ command line interactive example below. >>> # Redirect user to LinkedIn for authorization >>> authorization_url, state = linkedin.authorization_url(authorization_base_url) - >>> print("Please go here and authorize, {}".format(authorization_url)) + >>> print(f"Please go here and authorize: {authorization_url}") >>> # Get the authorization verifier code from the callback url >>> redirect_response = input('Paste the full redirect URL here:') From 3512901c01417a3e44333a0478eff19f841fa9ac Mon Sep 17 00:00:00 2001 From: jtroussard Date: Mon, 17 Feb 2020 15:47:17 -0500 Subject: [PATCH 5/6] PR comments - formatting --- docs/examples/linkedin.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/examples/linkedin.rst b/docs/examples/linkedin.rst index 9279b5fe..41d3ea16 100644 --- a/docs/examples/linkedin.rst +++ b/docs/examples/linkedin.rst @@ -40,7 +40,9 @@ command line interactive example below. >>> redirect_response = input('Paste the full redirect URL here:') >>> # Fetch the access token - >>> linkedin.fetch_token(token_url,client_secret=client_secret,include_client_id=True,authorization_response=redirect_response) + >>> linkedin.fetch_token(token_url,client_secret=client_secret, + ... include_client_id=True, + ... authorization_response=redirect_response) >>> # Fetch a protected resource, i.e. user profile >>> r = linkedin.get('https://api.linkedin.com/v2/me') From feafa6d6662a3264181195eb9e6304f26c0eeb4f Mon Sep 17 00:00:00 2001 From: jtroussard Date: Mon, 17 Feb 2020 15:55:43 -0500 Subject: [PATCH 6/6] PR comments - formatting --- docs/examples/linkedin.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/examples/linkedin.rst b/docs/examples/linkedin.rst index f64ae7af..71dd7331 100644 --- a/docs/examples/linkedin.rst +++ b/docs/examples/linkedin.rst @@ -40,7 +40,7 @@ command line interactive example below. >>> redirect_response = input('Paste the full redirect URL here:') >>> # Fetch the access token - >>> linkedin.fetch_token(token_url,client_secret=client_secret, + >>> linkedin.fetch_token(token_url, client_secret=client_secret, ... include_client_id=True, ... authorization_response=redirect_response)