From: Slava Bacherikov Date: Tue, 17 Apr 2012 16:20:57 +0000 (+0300) Subject: Add yandex. X-Git-Url: https://git.parisson.com/?a=commitdiff_plain;h=f43699c3f7a946361e61a7c98e89c0673a205d6a;p=django-social-auth.git Add yandex. --- diff --git a/example/settings.py b/example/settings.py index 877ed9a..9ccca23 100644 --- a/example/settings.py +++ b/example/settings.py @@ -79,6 +79,8 @@ AUTHENTICATION_BACKENDS = ( 'social_auth.backends.contrib.instagram.InstagramBackend', 'social_auth.backends.contrib.github.GithubBackend', 'social_auth.backends.contrib.vkontakte.VkontakteBackend', + 'social_auth.backends.contrib.yandex.YandexBackend', + 'social_auth.backends.contrib.yandex.YaruBackend', 'social_auth.backends.OpenIDBackend', 'social_auth.backends.contrib.livejournal.LiveJournalBackend', 'social_auth.backends.browserid.BrowserIDBackend', diff --git a/social_auth/backends/contrib/yandex.py b/social_auth/backends/contrib/yandex.py new file mode 100644 index 0000000..24414c6 --- /dev/null +++ b/social_auth/backends/contrib/yandex.py @@ -0,0 +1,93 @@ +""" +Yandex OAuth support. + +""" +from urllib import urlencode, urlopen +from urlparse import urlparse + +from django.utils import simplejson + +from social_auth.utils import setting +from social_auth.backends import BaseOAuth2, OAuthBackend, OpenIdAuth, \ + OpenIDBackend, USERNAME + + +# Vkontakte configuration +YANDEX_AUTHORIZATION_URL = 'https://oauth.yandex.ru/authorize' +YANDEX_ACCESS_TOKEN_URL = 'https://oauth.yandex.ru/token' +YANDEX_USER_DATA_URL = 'https://api.vk.com/method/users.get' +YANDEX_USER_ID_URL = 'https://api-yaru.yandex.ru/me/' +YANDEX_SERVER = 'oauth.yandex.ru' +YANDEX_OPENID_URL = 'http://openid.yandex.ru' + + +def get_username_from_url(links): + try: + host = urlparse(links.get('www')).hostname + return host.split('.')[0] + except (IndexError, AttributeError): + return None + + +class YandexBackend(OpenIDBackend): + """Yandex OpenID authentication backend""" + name = 'yandex' + + def get_user_id(self, details, response): + #validate_whitelists(self, details['email']) + return details['email'] + +class YandexAuth(OpenIdAuth): + """Yandex OpenID authentication""" + AUTH_BACKEND = YandexBackend + + def openid_url(self): + """Return Google OpenID service url""" + return YANDEX_OPENID_URL + +class YaruBackend(OAuthBackend): + """Yandex OAuth authentication backend""" + name = 'yaru' + EXTRA_DATA = [ + ('id', 'id'), + ('expires', setting('SOCIAL_AUTH_EXPIRATION', 'expires')) + ] + + def get_user_details(self, response): + """Return user details from Vkontakte account""" + return { USERNAME: get_username_from_url(response.get('links')), + 'email': response.get('email'), + 'first_name': response.get('name'), + } + + +class YaruAuth(BaseOAuth2): + """Yandex OAuth mechanism""" + AUTHORIZATION_URL = YANDEX_AUTHORIZATION_URL + ACCESS_TOKEN_URL = YANDEX_ACCESS_TOKEN_URL + SERVER_URL = YANDEX_SERVER + AUTH_BACKEND = YaruBackend + SETTINGS_KEY_NAME = 'YANDEX_APP_ID' + SETTINGS_SECRET_NAME = 'YANDEX_API_SECRET' + + def user_data(self, access_token, response, *args, **kwargs): + """Loads user data from service""" + params = {'oauth_token': access_token, + 'format': 'json', + } + headers = {'Content-Type': 'application/x-yaru+json; type=person', + 'Accept': 'application/x-yaru+json'} + + url = YANDEX_USER_ID_URL + '?' + urlencode(params) + try: + return simplejson.load(urlopen(url)) + except (ValueError, IndexError): + return None + + + +# Backend definition +BACKENDS = { + 'yandex': YandexAuth, + 'yaru': YaruAuth, +}