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):
'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:
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 = {