From af73c3b001be601480aa521a4a297989019ae563 Mon Sep 17 00:00:00 2001 From: Slava Bacherikov Date: Sun, 15 Apr 2012 15:57:17 +0300 Subject: [PATCH] Rewrited Github auth backend to new api. --- example/settings.py | 1 + social_auth/backends/__init__.py | 5 +- social_auth/backends/contrib/github.py | 77 +++++++------------------- 3 files changed, 24 insertions(+), 59 deletions(-) diff --git a/example/settings.py b/example/settings.py index 021a342..877ed9a 100644 --- a/example/settings.py +++ b/example/settings.py @@ -77,6 +77,7 @@ AUTHENTICATION_BACKENDS = ( 'social_auth.backends.contrib.linkedin.LinkedinBackend', 'social_auth.backends.contrib.flickr.FlickrBackend', 'social_auth.backends.contrib.instagram.InstagramBackend', + 'social_auth.backends.contrib.github.GithubBackend', 'social_auth.backends.contrib.vkontakte.VkontakteBackend', 'social_auth.backends.OpenIDBackend', 'social_auth.backends.contrib.livejournal.LiveJournalBackend', diff --git a/social_auth/backends/__init__.py b/social_auth/backends/__init__.py index 48f6320..45a6794 100644 --- a/social_auth/backends/__init__.py +++ b/social_auth/backends/__init__.py @@ -680,10 +680,11 @@ class BaseOAuth2(BaseOAuth): 'client_id': client_id, 'client_secret': client_secret, 'redirect_uri': self.redirect_uri} - headers = {'Content-Type': 'application/x-www-form-urlencoded'} + headers = {'Content-Type': 'application/x-www-form-urlencoded', + 'Accept': 'application/json'} request = Request(self.ACCESS_TOKEN_URL, data=urlencode(params), headers=headers) - + try: response = simplejson.loads(urlopen(request).read()) except HTTPError, e: diff --git a/social_auth/backends/contrib/github.py b/social_auth/backends/contrib/github.py index 84d6586..75d5c9d 100644 --- a/social_auth/backends/contrib/github.py +++ b/social_auth/backends/contrib/github.py @@ -18,14 +18,14 @@ from django.utils import simplejson from django.contrib.auth import authenticate from social_auth.utils import setting -from social_auth.backends import BaseOAuth, OAuthBackend, USERNAME -from social_auth.backends.exceptions import AuthFailed +from social_auth.backends import BaseOAuth2, OAuthBackend, USERNAME # GitHub configuration -GITHUB_AUTHORIZATION_URL = 'https://github.com/login/oauth/authorize?' -GITHUB_ACCESS_TOKEN_URL = 'https://github.com/login/oauth/access_token?' -GITHUB_USER_DATA_URL = 'https://api.github.com/user?' +GITHUB_AUTHORIZATION_URL = 'https://github.com/login/oauth/authorize' +GITHUB_ACCESS_TOKEN_URL = 'https://github.com/login/oauth/access_token' +GITHUB_USER_DATA_URL = 'https://api.github.com/user' +GITHUB_SERVER = 'github.com' class GithubBackend(OAuthBackend): @@ -44,56 +44,24 @@ class GithubBackend(OAuthBackend): 'first_name': response.get('name')} -class GithubAuth(BaseOAuth): - """Github OAuth mechanism""" +class GithubAuth(BaseOAuth2): + """Github OAuth2 mechanism""" + AUTHORIZATION_URL = GITHUB_AUTHORIZATION_URL + ACCESS_TOKEN_URL = GITHUB_ACCESS_TOKEN_URL + SERVER_URL = GITHUB_SERVER AUTH_BACKEND = GithubBackend - - def auth_url(self): - """Returns redirect url""" - args = { - 'client_id': setting('GITHUB_APP_ID'), - 'redirect_uri': self.redirect_uri - } - if setting('GITHUB_EXTENDED_PERMISSIONS'): - args['scope'] = ','.join(setting('GITHUB_EXTENDED_PERMISSIONS')) - args.update(self.auth_extra_arguments()) - return GITHUB_AUTHORIZATION_URL + urlencode(args) - - def auth_complete(self, *args, **kwargs): - """Returns user, might be logged in""" - if 'code' not in self.data: - error = self.data.get('error') or 'unknown error' - raise AuthFailed(self, error) - - url = GITHUB_ACCESS_TOKEN_URL + urlencode({ - 'client_id': setting('GITHUB_APP_ID'), - 'redirect_uri': self.redirect_uri, - 'client_secret': setting('GITHUB_API_SECRET'), - 'code': self.data['code'] - }) - response = cgi.parse_qs(urlopen(url).read()) - if response.get('error'): - error = self.data.get('error') or 'unknown error' - raise AuthFailed(self, error) - - access_token = response['access_token'][0] - data = self.user_data(access_token) - if data is not None: - if 'error' in data: - error = self.data.get('error') or 'unknown error' - raise AuthFailed(self, error) - data['access_token'] = access_token - - kwargs.update({ - 'auth': self, - 'response': data, - self.AUTH_BACKEND.name: True - }) - return authenticate(*args, **kwargs) - + SETTINGS_KEY_NAME = 'GITHUB_APP_ID' + SETTINGS_SECRET_NAME = 'GITHUB_API_SECRET' + SCOPE_SEPARATOR = ',' + + def get_scope(self): + """Return list with needed access scope""" + # Look at http://developer.github.com/v3/oauth/ + return setting('GITHUB_EXTENDED_PERMISSIONS', []) + def user_data(self, access_token, *args, **kwargs): """Loads user data from service""" - url = GITHUB_USER_DATA_URL + urlencode({ + url = GITHUB_USER_DATA_URL + '?' + urlencode({ 'access_token': access_token }) try: @@ -101,11 +69,6 @@ class GithubAuth(BaseOAuth): except ValueError: return None - @classmethod - def enabled(cls): - """Return backend enabled status by checking basic settings""" - return setting('GITHUB_APP_ID') and setting('GITHUB_API_SECRET') - # Backend definition BACKENDS = { -- 2.39.5