From: niQo Date: Mon, 19 Mar 2012 12:03:17 +0000 (+0100) Subject: Initial version of skyrock provider based on twitter, need test X-Git-Url: https://git.parisson.com/?a=commitdiff_plain;h=e8319061f89f7c8ac7ffc1817cd309f0829574c6;p=django-social-auth.git Initial version of skyrock provider based on twitter, need test --- diff --git a/social_auth/backends/contrib/skyrock.py b/social_auth/backends/contrib/skyrock.py new file mode 100644 index 0000000..b65754c --- /dev/null +++ b/social_auth/backends/contrib/skyrock.py @@ -0,0 +1,76 @@ +""" +Skyrock OAuth support. + +This adds support for Skyrock OAuth service. An application must +be registered first on skyrock and the settings SKYROCK_CONSUMER_KEY +and SKYROCK_CONSUMER_SECRET must be defined with they corresponding +values. + +User screen name is used to generate username. + +By default account id is stored in extra_data field, check OAuthBackend +class for details on how to extend it. +""" +from django.utils import simplejson + +from social_auth.backends import ConsumerBasedOAuth, OAuthBackend, USERNAME + + +# Skyrock configuration +SKYROCK_SERVER = 'api.skyrock.com/v2' +SKYROCK_REQUEST_TOKEN_URL = 'https://%s/oauth/initiate' % SKYROCK_SERVER +SKYROCK_ACCESS_TOKEN_URL = 'https://%s/oauth/token' % SKYROCK_SERVER +# Note: oauth/authorize forces the user to authorize every time. +# oauth/authenticate uses their previous selection, barring revocation. +SKYROCK_AUTHORIZATION_URL = 'http://%s/oauth/authenticate' % SKYROCK_SERVER +SKYROCK_CHECK_AUTH = 'https://%s/user/get.json' % SKYROCK_SERVER + + +class SkyrockBackend(OAuthBackend): + """Skyrock OAuth authentication backend""" + name = 'skyrock' + EXTRA_DATA = [('id', 'id')] + + def get_user_id(self, details, response): + return response['id_user'] + + def get_user_details(self, response): + """Return user details from Skyrock account""" + return {USERNAME: response['username'], + 'email': response['email'], + 'fullname': response['firstname'] + ' ' + response['name'], + 'first_name': response['firstname'], + 'last_name': response['name']} + + +class SkyrockAuth(ConsumerBasedOAuth): + """Skyrock OAuth authentication mechanism""" + AUTHORIZATION_URL = SKYROCK_AUTHORIZATION_URL + REQUEST_TOKEN_URL = SKYROCK_REQUEST_TOKEN_URL + ACCESS_TOKEN_URL = SKYROCK_ACCESS_TOKEN_URL + SERVER_URL = SKYROCK_SERVER + AUTH_BACKEND = SkyrockBackend + SETTINGS_KEY_NAME = 'SKYROCK_CONSUMER_KEY' + SETTINGS_SECRET_NAME = 'SKYROCK_CONSUMER_SECRET' + + def user_data(self, access_token): + """Return user data provided""" + request = self.oauth_request(access_token, SKYROCK_CHECK_AUTH) + json = self.fetch_response(request) + try: + return simplejson.loads(json) + except ValueError: + return None + + def auth_complete(self, *args, **kwargs): + """Completes loging process, must return user instance""" + if 'denied' in self.data: + raise ValueError('Authentication denied') + else: + return super(SkyrockAuth, self).auth_complete(*args, **kwargs) + + +# Backend definition +BACKENDS = { + 'skyrock': SkyrockAuth, +}