From 3ba946325328bfba7b455992991042b4f9c52548 Mon Sep 17 00:00:00 2001 From: Stas Kravets Date: Wed, 19 Jan 2011 18:53:41 +0300 Subject: [PATCH] Yandex.ru support added; small change in default e-mail value in OpenIDBackend.get_user_details in order to make sure it is not None. --- example/settings.py | 1 + example/templates/done.html | 11 ++++++ example/templates/home.html | 9 +++++ social_auth/backends/__init__.py | 3 ++ social_auth/backends/contrib/yandex.py | 46 ++++++++++++++++++++++++++ 5 files changed, 70 insertions(+) create mode 100644 social_auth/backends/contrib/yandex.py diff --git a/example/settings.py b/example/settings.py index ac731ea..935afe8 100644 --- a/example/settings.py +++ b/example/settings.py @@ -70,6 +70,7 @@ AUTHENTICATION_BACKENDS = ( 'social_auth.backends.OpenIDBackend', 'social_auth.backends.contrib.livejournal.LiveJournalBackend', 'social_auth.backends.contrib.vkontakte.VKontakteBackend', + 'social_auth.backends.contrib.yandex.YandexBackend', 'django.contrib.auth.backends.ModelBackend', ) diff --git a/example/templates/done.html b/example/templates/done.html index 3b90b81..fa4ff18 100644 --- a/example/templates/done.html +++ b/example/templates/done.html @@ -56,6 +56,17 @@ +
  • +
    {% csrf_token %} +
    + + + +
    +
    +
  • {% csrf_token %}
    diff --git a/example/templates/home.html b/example/templates/home.html index 317895b..6126124 100644 --- a/example/templates/home.html +++ b/example/templates/home.html @@ -27,6 +27,15 @@
  • +
  • +
    {% csrf_token %} +
    + + + +
    +
    +
  • {% csrf_token %}
    diff --git a/social_auth/backends/__init__.py b/social_auth/backends/__init__.py index eff0642..01f9aa5 100644 --- a/social_auth/backends/__init__.py +++ b/social_auth/backends/__init__.py @@ -233,6 +233,9 @@ class OpenIDBackend(SocialAuthBackend): first_name = values.get('first_name') or '' last_name = values.get('last_name') or '' + if not values['email']: + values['email'] = '' + if not fullname and first_name and last_name: fullname = first_name + ' ' + last_name elif fullname: diff --git a/social_auth/backends/contrib/yandex.py b/social_auth/backends/contrib/yandex.py new file mode 100644 index 0000000..39b5b1d --- /dev/null +++ b/social_auth/backends/contrib/yandex.py @@ -0,0 +1,46 @@ +""" +Yandex OpenID support. + +This contribution adds support for Yandex.ru OpenID service in the form +openid.yandex.ru/user. Username is retrieved from the identity url. +""" +import urlparse + +from social_auth.backends import OpenIDBackend, OpenIdAuth, USERNAME + + +# Yandex conf +YANDEX_URL = 'http://openid.yandex.ru/%s' +YANDEX_USER_FIELD = 'openid_ya_user' + + +class YandexBackend(OpenIDBackend): + """Yandex OpenID authentication backend""" + name = 'yandex' + + def get_user_details(self, response): + """Generate username from identity url""" + values = super(YandexBackend, self).get_user_details(response) + values[USERNAME] = values.get(USERNAME) or \ + urlparse.urlsplit(response.identity_url)\ + .path.strip('/') + + values['email'] = values.get('email') or values[USERNAME] + '@yandex.ru' + return values + + +class YandexAuth(OpenIdAuth): + """Yandex OpenID authentication""" + AUTH_BACKEND = YandexBackend + + def openid_url(self): + """Returns Yandex authentication URL""" + if self.request.method != 'POST' or \ + not self.request.POST.get(YANDEX_USER_FIELD): + raise ValueError, 'Missing Yandex user identifier' + return YANDEX_URL % self.request.POST[YANDEX_USER_FIELD] + +# Backend definition +BACKENDS = { + 'yandex': YandexAuth, +} -- 2.39.5