1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
|
"""
Yahoo OpenId and OAuth1 backends, docs at:
http://psa.matiasaguirre.net/docs/backends/yahoo.html
"""
from social.backends.open_id import OpenIdAuth
from social.backends.oauth import BaseOAuth1
class YahooOpenId(OpenIdAuth):
"""Yahoo OpenID authentication backend"""
name = 'yahoo'
URL = 'http://me.yahoo.com'
class YahooOAuth(BaseOAuth1):
"""Yahoo OAuth authentication backend"""
name = 'yahoo-oauth'
ID_KEY = 'guid'
AUTHORIZATION_URL = 'https://api.login.yahoo.com/oauth/v2/request_auth'
REQUEST_TOKEN_URL = \
'https://api.login.yahoo.com/oauth/v2/get_request_token'
ACCESS_TOKEN_URL = 'https://api.login.yahoo.com/oauth/v2/get_token'
EXTRA_DATA = [
('guid', 'id'),
('access_token', 'access_token'),
('expires', 'expires')
]
def get_user_details(self, response):
"""Return user details from Yahoo Profile"""
fullname, first_name, last_name = self.get_user_names(
first_name=response.get('givenName'),
last_name=response.get('familyName')
)
emails = [email for email in response.get('emails', [])
if email.get('handle')]
emails.sort(key=lambda e: e.get('primary', False))
return {'username': response.get('nickname'),
'email': emails[0]['handle'] if emails else '',
'fullname': fullname,
'first_name': first_name,
'last_name': last_name}
def user_data(self, access_token, *args, **kwargs):
"""Loads user data from service"""
url = 'https://social.yahooapis.com/v1/user/{0}/profile?format=json'
return self.get_json(
url.format(self._get_guid(access_token)),
auth=self.oauth_auth(access_token)
)['profile']
def _get_guid(self, access_token):
"""
Beause you have to provide GUID for every API request
it's also returned during one of OAuth calls
"""
return self.get_json(
'https://social.yahooapis.com/v1/me/guid?format=json',
auth=self.oauth_auth(access_token)
)['guid']['value']
|