'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',
)
</div>
</form>
</li>
+ <li>
+ <form action="/login/yandex/" method="post">{% csrf_token %}
+ <div>
+ <label for="openid_ya_user">Yandex user
+ {% if yandex %} <span class="associated">(associated)</span>{% endif %}:
+ </label>
+ <input id="openid_ya_user" type="text" value="" name="openid_ya_user" />
+ <input type="submit" value="Login"/>
+ </div>
+ </form>
+ </li>
<li>
<form action="/associate/openid/" method="post">{% csrf_token %}
<div>
</div>
</form>
</li>
+ <li>
+ <form action="/login/yandex/" method="post">{% csrf_token %}
+ <div>
+ <label for="openid_ya_user">Yandex user:</label>
+ <input id="openid_ya_user" type="text" value="" name="openid_ya_user" />
+ <input type="submit" value="Login"/>
+ </div>
+ </form>
+ </li>
<li>
<form action="/login/openid/" method="post">{% csrf_token %}
<div>
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:
--- /dev/null
+"""
+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,
+}