]> git.parisson.com Git - django-social-auth.git/commitdiff
Mail.ru OAuth 2.0 support added.
authorStas Kravets <skravets@applebough.(none)>
Sat, 30 Apr 2011 07:12:47 +0000 (11:12 +0400)
committerStas Kravets <skravets@applebough.(none)>
Sat, 30 Apr 2011 07:12:47 +0000 (11:12 +0400)
example/local_settings.py.template
example/settings.py
example/templates/done.html
example/templates/home.html
social_auth/backends/contrib/mailru.py [new file with mode: 0644]
social_auth/backends/contrib/odnoklassniki.py

index 0f8e6e8e3e467ddecd8ef489ea5b81cfbdb291d9..b0583aac689e47c5e6d7f1578efcd386421963d7 100644 (file)
@@ -18,5 +18,8 @@ VKONTAKTE_APP_SECRET              = ''
 ODNOKLASSNIKI_OAUTH2_CLIENT_KEY   = ''
 ODNOKLASSNIKI_OAUTH2_APP_KEY      = ''
 ODNOKLASSNIKI_OAUTH2_CLIENT_SECRET = ''
+MAILRU_OAUTH2_CLIENT_KEY                 = ''
+MAILRU_OAUTH2_APP_KEY                    = ''
+MAILRU_OAUTH2_CLIENT_SECRET       = ''
 #SOCIAL_AUTH_USER_MODEL            = 'app.CustomUser'
 SOCIAL_AUTH_ERROR_KEY             = 'socialauth_error'
index 06d3e89e590c4cf2e093fc4530ac5db62e92ea23..7483d287c53ddf9ab21a68d7155b0b13d03f5063 100644 (file)
@@ -75,6 +75,7 @@ AUTHENTICATION_BACKENDS = (
     'social_auth.backends.contrib.yandex.YandexBackend',
     'social_auth.backends.contrib.odnoklassniki.OdnoklassnikiBackend',
     'social_auth.backends.contrib.vkontakte.VKontakteOAuth2Backend',
+    'social_auth.backends.contrib.mailru.MailruBackend',
     'django.contrib.auth.backends.ModelBackend',
 )
 
index cc846351a62a97d616fd00c660a75e2e6a1622a0..b0f9e70815e165e39dc7ddb7dc6350c459fbe235 100644 (file)
@@ -48,7 +48,8 @@
          {% if odnoklassniki %}<span class="disconnect">(<a href="{% url disconnect "odnoklassniki" %}">disconnect</a>)</span>{% endif %}
          <li><a rel="nofollow" href="{% url associate_begin "vkontakte-oauth2" %}">VKontakte OAuth 2.0</a></li>
          {% if vkontakte_oauth2 %}<span class="disconnect">(<a href="{% url disconnect "vkontakte-oauth2" %}">disconnect</a>)</span>{% endif %}
-
+         <li><a rel="nofollow" href="{% url associate_begin "mailru-oauth2" %}">Mail.ru OAuth 2.0</a></li>
+         {% if mailru_oauth2 %}<span class="disconnect">(<a href="{% url disconnect "mailru-oauth2" %}">disconnect</a>)</span>{% endif %}
     </li>
   </ul>
 
@@ -74,7 +75,7 @@
       </form>
     </li>
     <li>
-      <form action="{% url begin "yandex" %} method="post">{% csrf_token %}
+      <form action="{% url associate_begin "yandex" %}" method="post">{% csrf_token %}
         <div>
           <label for="openid_ya_user">Yandex user
             {% if yandex %}(<span class="disconnect"><a href="{% url disconnect "yandex" %}">disconnect</a>)</span>{% endif %}
index 46c03a6d73699120c165e7ff9d590458cdc03efe..b845eb0a5f6acf540ba00cca3e49c6c2c4ad9dcd 100644 (file)
@@ -20,6 +20,7 @@
     <li><a rel="nofollow" href="{% url begin "google-oauth2" %}">Google OAuth2</a></li>
        <li><a rel="nofollow" href="{% url begin "odnoklassniki" %}">Odnoklassniki OAuth 2.0</a></li>
        <li><a rel="nofollow" href="{% url begin "vkontakte-oauth2" %}">VKontakte OAuth 2.0</a></li>
+       <li><a rel="nofollow" href="{% url begin "mailru-oauth2" %}">Mail.ru OAuth 2.0</a></li>
   </ul>
 </div>
 
diff --git a/social_auth/backends/contrib/mailru.py b/social_auth/backends/contrib/mailru.py
new file mode 100644 (file)
index 0000000..583c01a
--- /dev/null
@@ -0,0 +1,88 @@
+"""
+Mail.ru OAuth2 support
+
+Take a look to http://api.mail.ru/docs/guides/oauth/
+
+You need to register OAuth site here:
+http://api.mail.ru/sites/my/add
+
+Then update your settings values using registration information
+
+"""
+
+from django.conf import settings
+from django.utils import simplejson
+
+from urllib import urlencode, unquote
+from urllib2 import Request, urlopen, HTTPError
+from hashlib import md5
+
+from social_auth.backends import OAuthBackend, BaseOAuth2, USERNAME
+
+MAILRU_API_URL       = 'http://www.appsmail.ru/platform/api'
+MAILRU_OAUTH2_SCOPE  = ['']
+
+EXPIRES_NAME = getattr(settings, 'SOCIAL_AUTH_EXPIRATION', 'expires')
+
+class MailruBackend(OAuthBackend):
+    """Mail.ru authentication backend"""
+    name = 'mailru-oauth2'
+    EXTRA_DATA = [('refresh_token', 'refresh_token'),
+                  ('expires_in', EXPIRES_NAME)]
+
+    def get_user_id(self, details, response):
+        """Return user unique id provided by Mail.ru"""
+        return int(response['uid'])
+    
+    def get_user_details(self, response):
+        """Return user details from Mail.ru request"""
+        values = { USERNAME: unquote(response['nick']), 'email': unquote(response['email']),
+                  'first_name': unquote(response['first_name']), 'last_name': unquote(response['last_name'])}
+        
+        if values['first_name'] and values['last_name']:
+            values['fullname'] = "%s %s" % (values['first_name'], values['last_name'])
+        return values
+    
+
+class MailruOAuth2(BaseOAuth2):
+    """Mail.ru OAuth2 support"""
+    AUTH_BACKEND = MailruBackend
+    AUTHORIZATION_URL = 'https://connect.mail.ru/oauth/authorize'
+    ACCESS_TOKEN_URL = 'https://connect.mail.ru/oauth/token'
+    SETTINGS_KEY_NAME = 'MAILRU_OAUTH2_CLIENT_KEY'
+    SETTINGS_SECRET_NAME = 'MAILRU_OAUTH2_CLIENT_SECRET'
+
+    def get_scope(self):
+        return MAILRU_OAUTH2_SCOPE + getattr(settings, 'MAILRU_OAUTH2_EXTRA_SCOPE', [])
+
+    def user_data(self, access_token):
+        """Return user data from Mail.ru REST API"""
+        data = {'method': 'users.getInfo', 'session_key': access_token}
+        return mailru_api(data)[0]
+
+def mailru_sig(data):
+    """ Calculates signature of request data """
+    
+    param_list = sorted(list(item + '=' + data[item] for item in data))
+    
+    return md5(''.join(param_list) + settings.MAILRU_OAUTH2_CLIENT_SECRET).hexdigest() 
+    
+def mailru_api(data):
+    """ Calls Mail.ru REST API method
+        http://api.mail.ru/docs/guides/restapi/
+    """
+    data.update({'app_id': settings.MAILRU_OAUTH2_CLIENT_KEY, 'secure': '1'})
+    data['sig'] = mailru_sig(data)
+    
+    params = urlencode(data)
+    request = Request(MAILRU_API_URL, params)
+    try:
+        return simplejson.loads(urlopen(request).read())
+    except (TypeError, KeyError, IOError, ValueError, IndexError):
+        return None
+    
+
+# Backend definition
+BACKENDS = {
+    'mailru-oauth2': MailruOAuth2
+}
\ No newline at end of file
index d05d64d04a57ca015eb3c74e5dab434f10339e3f..ad5770151b00b5cc5b2b78a4c0216fc3d0970fc8 100644 (file)
@@ -46,7 +46,7 @@ class OdnoklassnikiOAuth2(BaseOAuth2):
     """Odnoklassniki OAuth2 support"""
     AUTH_BACKEND = OdnoklassnikiBackend
     AUTHORIZATION_URL = 'http://www.odnoklassniki.ru/oauth/authorize'
-    ACCESS_TOKEN_URL = ' http://api.odnoklassniki.ru/oauth/token.do'
+    ACCESS_TOKEN_URL = 'http://api.odnoklassniki.ru/oauth/token.do'
     SETTINGS_KEY_NAME = 'ODNOKLASSNIKI_OAUTH2_CLIENT_KEY'
     SETTINGS_SECRET_NAME = 'ODNOKLASSNIKI_OAUTH2_CLIENT_SECRET'