Skip to content

Commit 996e2f5

Browse files
author
Jacques Troussard
committed
Revert "Merge pull request #397 from requests/linkedin-compliance-removal"
This reverts commit d75279c, reversing changes made to 29ba9af.
1 parent 6ac6133 commit 996e2f5

File tree

4 files changed

+71
-21
lines changed

4 files changed

+71
-21
lines changed

docs/examples/linkedin.rst

Lines changed: 11 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -9,41 +9,31 @@ command line interactive example below.
99

1010
.. code-block:: pycon
1111
12-
>>> # Imports
13-
>>> import os
14-
>>> from requests_oauthlib import OAuth2Session
15-
16-
>>> # Set environment variables
17-
>>> os.environ['OAUTHLIB_INSECURE_TRANSPORT'] = '1'
18-
1912
>>> # Credentials you get from registering a new application
2013
>>> client_id = '<the id you get from linkedin>'
2114
>>> client_secret = '<the secret you get from linkedin>'
2215
23-
>>> # LinkedIn OAuth2 requests require scope and redirect_url parameters.
24-
>>> # Ensure these values match the auth values in your LinkedIn App
25-
>>> # (see auth tab on LinkedIn Developer page)
26-
>>> scope = ['r_liteprofile']
27-
>>> redirect_url = 'http://127.0.0.1'
28-
2916
>>> # OAuth endpoints given in the LinkedIn API documentation
30-
>>> authorization_base_url = 'https://www.linkedin.com/oauth/v2/authorization'
31-
>>> token_url = 'https://www.linkedin.com/oauth/v2/accessToken'
17+
>>> authorization_base_url = 'https://www.linkedin.com/uas/oauth2/authorization'
18+
>>> token_url = 'https://www.linkedin.com/uas/oauth2/accessToken'
19+
20+
>>> from requests_oauthlib import OAuth2Session
21+
>>> from requests_oauthlib.compliance_fixes import linkedin_compliance_fix
3222
33-
>>> linkedin = OAuth2Session(client_id, redirect_uri='http://127.0.0.1', scope=scope)
23+
>>> linkedin = OAuth2Session(client_id, redirect_uri='http://127.0.0.1')
24+
>>> linkedin = linkedin_compliance_fix(linkedin)
3425
3526
>>> # Redirect user to LinkedIn for authorization
3627
>>> authorization_url, state = linkedin.authorization_url(authorization_base_url)
37-
>>> print(f"Please go here and authorize: {authorization_url}")
28+
>>> print 'Please go here and authorize,', authorization_url
3829
3930
>>> # Get the authorization verifier code from the callback url
40-
>>> redirect_response = input('Paste the full redirect URL here:')
31+
>>> redirect_response = raw_input('Paste the full redirect URL here:')
4132
4233
>>> # Fetch the access token
4334
>>> linkedin.fetch_token(token_url, client_secret=client_secret,
44-
... include_client_id=True,
4535
... authorization_response=redirect_response)
4636
4737
>>> # Fetch a protected resource, i.e. user profile
48-
>>> r = linkedin.get('https://api.linkedin.com/v2/me')
49-
>>> print(r.content)
38+
>>> r = linkedin.get('https://api.linkedin.com/v1/people/~')
39+
>>> print r.content

requests_oauthlib/compliance_fixes/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from .facebook import facebook_compliance_fix
44
from .fitbit import fitbit_compliance_fix
5+
from .linkedin import linkedin_compliance_fix
56
from .slack import slack_compliance_fix
67
from .instagram import instagram_compliance_fix
78
from .mailchimp import mailchimp_compliance_fix
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
from json import loads, dumps
2+
3+
from oauthlib.common import add_params_to_uri, to_unicode
4+
5+
6+
def linkedin_compliance_fix(session):
7+
def _missing_token_type(r):
8+
token = loads(r.text)
9+
token["token_type"] = "Bearer"
10+
r._content = to_unicode(dumps(token)).encode("UTF-8")
11+
return r
12+
13+
def _non_compliant_param_name(url, headers, data):
14+
token = [("oauth2_access_token", session.access_token)]
15+
url = add_params_to_uri(url, token)
16+
return url, headers, data
17+
18+
session._client.default_token_placement = "query"
19+
session.register_compliance_hook("access_token_response", _missing_token_type)
20+
session.register_compliance_hook("protected_request", _non_compliant_param_name)
21+
return session

tests/test_compliance_fixes.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
from requests_oauthlib import OAuth2Session
1515
from requests_oauthlib.compliance_fixes import facebook_compliance_fix
1616
from requests_oauthlib.compliance_fixes import fitbit_compliance_fix
17+
from requests_oauthlib.compliance_fixes import linkedin_compliance_fix
1718
from requests_oauthlib.compliance_fixes import mailchimp_compliance_fix
1819
from requests_oauthlib.compliance_fixes import weibo_compliance_fix
1920
from requests_oauthlib.compliance_fixes import slack_compliance_fix
@@ -99,6 +100,43 @@ def test_refresh_token(self):
99100
self.assertEqual(token["refresh_token"], "refresh")
100101

101102

103+
class LinkedInComplianceFixTest(TestCase):
104+
def setUp(self):
105+
mocker = requests_mock.Mocker()
106+
mocker.post(
107+
"https://www.linkedin.com/uas/oauth2/accessToken",
108+
json={"access_token": "linkedin"},
109+
)
110+
mocker.post(
111+
"https://api.linkedin.com/v1/people/~/shares",
112+
status_code=201,
113+
json={
114+
"updateKey": "UPDATE-3346389-595113200",
115+
"updateUrl": "https://www.linkedin.com/updates?discuss=abc&scope=xyz",
116+
},
117+
)
118+
mocker.start()
119+
self.addCleanup(mocker.stop)
120+
121+
linkedin = OAuth2Session("someclientid", redirect_uri="https://i.b")
122+
self.session = linkedin_compliance_fix(linkedin)
123+
124+
def test_fetch_access_token(self):
125+
token = self.session.fetch_token(
126+
"https://www.linkedin.com/uas/oauth2/accessToken",
127+
client_secret="someclientsecret",
128+
authorization_response="https://i.b/?code=hello",
129+
)
130+
self.assertEqual(token, {"access_token": "linkedin", "token_type": "Bearer"})
131+
132+
def test_protected_request(self):
133+
self.session.token = {"access_token": "dummy-access-token"}
134+
response = self.session.post("https://api.linkedin.com/v1/people/~/shares")
135+
url = response.request.url
136+
query = parse_qs(urlparse(url).query)
137+
self.assertEqual(query["oauth2_access_token"], ["dummy-access-token"])
138+
139+
102140
class MailChimpComplianceFixTest(TestCase):
103141
def setUp(self):
104142
mocker = requests_mock.Mocker()

0 commit comments

Comments
 (0)