requests / requests-oauthlib

OAuthlib support for Python-Requests!
https://requests-oauthlib.readthedocs.org/
ISC License
1.71k stars 421 forks source link

How to test if LinkedIn token is still valid and re-use? #519

Closed NebularNerd closed 8 months ago

NebularNerd commented 8 months ago

I've followed and adapted the code example for LinkedIn shown here LinkedIn Example and so far so good. I can generate an OAuth code and hand it off to make an access token, which then runs the next step:

>>> # Fetch the access token
>>> linkedin.fetch_token(token_url, client_secret=client_secret,
...                      include_client_id=True,
...                      authorization_response=redirect_response)

This also runs and then 403 errors as I don't have access to the me api scopes but thats ok.

I'm trying to find where the access token from the fetch_token is stored and how to test if it's still valid so I can use it on the next run.

Any help on this would be great 🙂

NebularNerd commented 8 months ago

A night's sleep and some strong coffee and I have figured that bit out 😁

For anyone searching this, change the above to:

# Fetch the access token
token = linkedin.fetch_token(token_url, client_secret=client_secret,
                     include_client_id=True,
                      authorization_response=redirect_response)
print (token)

This will give you the a reply similar to below, with your token and expiration in seconds (about 60 days):

{'access_token': 'big_long_alphanumeric_token_string_you must_not_share_with_anyone', 'expires_in': 5183999, 'scope': ['w_member_social'], 'expires_at': 1703931864.3299844}

Depending on your access level etc.. you may also at get your refresh token in this reply. Next step, let's figure out how to pass this to the .get request

NebularNerd commented 8 months ago

OK found out how to get this working (I think, I need to re-auth my LinkedIn app for company page scopes)

To add the auth token to your requests update the following:

>>> # Fetch a protected resource, i.e. user profile
>>> r = linkedin.get('https://api.linkedin.com/v2/me')
>>> print(r.content)

to:

v = 202402 # Check the API docs for the current API version as they do no update regularly like I thought
token = "big_long_alphanumeric_token_string_you must_not_share_with_anyone"
linkedin.headers.update({"Authorization": f'Bearer {token}',"LinkedIn-Version": v,"X-Restli-Protocol-Version": "2.0.0"})
r = linkedin.get('https://api.linkedin.com/v2/me')
print(r.content)

I'm getting errors at present due to my scopes, but it's passing the access token over a treat. 😁

I shall close this for now but will leave it here and update for others to find if it helps.