def auth_url(self):
"""Must return redirect URL to auth provider"""
- raise NotImplementedError, 'Implement in subclass'
+ raise NotImplementedError('Implement in subclass')
def auth_html(self):
"""Must return login HTML content returned by provider"""
- raise NotImplementedError, 'Implement in subclass'
+ raise NotImplementedError('Implement in subclass')
def auth_complete(self, *args, **kwargs):
"""Completes loging process, must return user instance"""
- raise NotImplementedError, 'Implement in subclass'
+ raise NotImplementedError('Implement in subclass')
@property
def uses_redirect(self):
response = self.consumer().complete(dict(self.request.REQUEST.items()),
self.request.build_absolute_uri())
if not response:
- raise ValueError, 'This is an OpenID relying party endpoint'
+ raise ValueError('This is an OpenID relying party endpoint')
elif response.status == SUCCESS:
kwargs.update({'response': response, self.AUTH_BACKEND.name: True})
return authenticate(*args, **kwargs)
elif response.status == FAILURE:
- raise ValueError, 'OpenID authentication failed: %s' % response.message
+ raise ValueError('OpenID authentication failed: %s' % \
+ response.message)
elif response.status == CANCEL:
- raise ValueError, 'Authentication cancelled'
+ raise ValueError('Authentication cancelled')
else:
- raise ValueError, 'Unknown OpenID response type: %r' % response.status
+ raise ValueError('Unknown OpenID response type: %r' % \
+ response.status)
def setup_request(self):
"""Setup request"""
# for attribute exchange, use that.
if openid_request.endpoint.supportsType(ax.AXMessage.ns_uri):
fetch_request = ax.FetchRequest()
- # Mark all attributes as required, since Google ignores optional ones
+ # Mark all attributes as required, Google ignores optional ones
for attr, alias in AX_ATTRS:
- fetch_request.add(ax.AttrInfo(attr, alias=alias, required=True))
+ fetch_request.add(ax.AttrInfo(attr, alias=alias,
+ required=True))
else:
fetch_request = sreg.SRegRequest(optional=SREG_ATTR)
openid_request.addExtension(fetch_request)
HTML content will be returned.
"""
if not hasattr(self, '_uses_redirect'):
- setattr(self, '_uses_redirect', self.openid_request().shouldSendRedirect())
+ setattr(self, '_uses_redirect',
+ self.openid_request().shouldSendRedirect())
return getattr(self, '_uses_redirect', True)
def openid_request(self):
openid_url = self.openid_url()
try:
openid_request = self.consumer().begin(openid_url)
- except DiscoveryFailure, e:
- raise ValueError, 'OpenID discovery error: %s' % e
+ except DiscoveryFailure, err:
+ raise ValueError('OpenID discovery error: %s' % err)
else:
setattr(self, '_openid_request', openid_request)
return getattr(self, '_openid_request', None)
"""Return service provider URL.
This base class is generic accepting a POST parameter that specifies
provider URL."""
- if self.request.method != 'POST' or OPENID_ID_FIELD not in self.request.POST:
- raise ValueError, 'Missing openid identifier'
+ if self.request.method != 'POST' or \
+ OPENID_ID_FIELD not in self.request.POST:
+ raise ValueError('Missing openid identifier')
return self.request.POST[OPENID_ID_FIELD]
@AUTH_BACKEND Authorization backend related with
this service
"""
- AUTHORIZATION_URL = ''
- REQUEST_TOKEN_URL = ''
- ACCESS_TOKEN_URL = ''
- SERVER_URL = ''
- AUTH_BACKEND = None
+ AUTHORIZATION_URL = ''
+ REQUEST_TOKEN_URL = ''
+ ACCESS_TOKEN_URL = ''
+ SERVER_URL = ''
+ AUTH_BACKEND = None
def auth_url(self):
"""Returns redirect url"""
name = self.AUTH_BACKEND.name + 'unauthorized_token_name'
unauthed_token = self.request.session.get(name)
if not unauthed_token:
- raise ValueError, 'Missing unauthorized token'
+ raise ValueError('Missing unauthorized token')
token = OAuthToken.from_string(unauthed_token)
if token.key != self.request.GET.get('oauth_token', 'no-token'):
- raise ValueError, 'Incorrect tokens'
+ raise ValueError('Incorrect tokens')
access_token = self.access_token(token)
data = self.user_data(access_token)
def user_data(self, access_token):
"""Loads user data from service"""
- raise NotImplementedError, 'Implement in subclass'
+ raise NotImplementedError('Implement in subclass')
@property
def connection(self):
"""Return tuple with Consumer Key and Consumer Secret for current
service provider. Must return (key, secret), order must be respected.
"""
- raise NotImplementedError, 'Implement in subclass'
+ raise NotImplementedError('Implement in subclass')
class OrkutAuth(ConsumerBasedOAuth):
"""Orkut OAuth authentication mechanism"""
- AUTHORIZATION_URL = ORKUT_AUTHORIZATION_URL
- REQUEST_TOKEN_URL = ORKUT_REQUEST_TOKEN_URL
- ACCESS_TOKEN_URL = ORKUT_ACCESS_TOKEN_URL
- SERVER_URL = ORKUT_SERVER
- AUTH_BACKEND = OrkutBackend
+ AUTHORIZATION_URL = ORKUT_AUTHORIZATION_URL
+ REQUEST_TOKEN_URL = ORKUT_REQUEST_TOKEN_URL
+ ACCESS_TOKEN_URL = ORKUT_ACCESS_TOKEN_URL
+ SERVER_URL = ORKUT_SERVER
+ AUTH_BACKEND = OrkutBackend
def user_data(self, access_token):
"""Loads user data from Orkut service"""
class TwitterAuth(ConsumerBasedOAuth):
"""Twitter OAuth authentication mechanism"""
- AUTHORIZATION_URL = TWITTER_AUTHORIZATION_URL
- REQUEST_TOKEN_URL = TWITTER_REQUEST_TOKEN_URL
- ACCESS_TOKEN_URL = TWITTER_ACCESS_TOKEN_URL
- SERVER_URL = TWITTER_SERVER
- AUTH_BACKEND = TwitterBackend
+ AUTHORIZATION_URL = TWITTER_AUTHORIZATION_URL
+ REQUEST_TOKEN_URL = TWITTER_REQUEST_TOKEN_URL
+ ACCESS_TOKEN_URL = TWITTER_ACCESS_TOKEN_URL
+ SERVER_URL = TWITTER_SERVER
+ AUTH_BACKEND = TwitterBackend
def user_data(self, access_token):
"""Return user data provided"""
data = self.user_data(access_token)
if data is not None:
if 'error' in data:
- raise ValueError, 'Authentication error'
+ raise ValueError('Authentication error')
data['access_token'] = access_token
kwargs.update({'response': data, FacebookBackend.name: True})
return authenticate(*args, **kwargs)
else:
- raise ValueError, 'Authentication error'
+ raise ValueError('Authentication error')
def user_data(self, access_token):
"""Loads user data from service"""
class SocialAuthBackend(ModelBackend):
"""A django.contrib.auth backend that authenticates the user based on
a authentication provider response"""
- name = '' # provider name, it's stored in database
+ name = '' # provider name, it's stored in database
def authenticate(self, *args, **kwargs):
"""Authenticate user using social credentials
uid=uid)
except UserSocialAuth.DoesNotExist:
user = kwargs.get('user')
- if user is None: # new user
+ if user is None: # new user
if not getattr(settings, 'SOCIAL_AUTH_CREATE_USERS', True):
return None
username = self.username(details)
def get_user_id(self, details, response):
"""Must return a unique ID from values returned on details"""
- raise NotImplementedError, 'Implement in subclass'
+ raise NotImplementedError('Implement in subclass')
def get_user_details(self, response):
"""Must return user details in a know internal struct:
'first_name': <user first name if any>,
'last_name': <user last name if any>}
"""
- raise NotImplementedError, 'Implement in subclass'
+ raise NotImplementedError('Implement in subclass')
def get_user(self, user_id):
"""Return user instance for @user_id"""
def get_user_details(self, response):
"""Return user details from Twitter account"""
return {USERNAME: response['screen_name'],
- 'email': '', # not supplied
+ 'email': '', # not supplied
'fullname': response['name'],
'first_name': response['name'],
'last_name': ''}
if not fullname and first_name and last_name:
fullname = first_name + ' ' + last_name
elif fullname:
- try: # Try to split name for django user storage
+ try: # Try to split name for django user storage
first_name, last_name = fullname.rsplit(' ', 1)
except ValueError:
last_name = fullname
"""Google OpenID authentication backend"""
name = 'google'
+
class YahooBackend(OpenIDBackend):
"""Yahoo OpenID authentication backend"""
name = 'yahoo'
"""Conf settings"""
# Twitter configuration
-TWITTER_SERVER = 'api.twitter.com'
-TWITTER_REQUEST_TOKEN_URL = 'https://%s/oauth/request_token' % TWITTER_SERVER
-TWITTER_ACCESS_TOKEN_URL = 'https://%s/oauth/access_token' % TWITTER_SERVER
-TWITTER_AUTHORIZATION_URL = 'http://%s/oauth/authorize' % TWITTER_SERVER
-TWITTER_CHECK_AUTH = 'https://twitter.com/account/verify_credentials.json'
+TWITTER_SERVER = 'api.twitter.com'
+TWITTER_REQUEST_TOKEN_URL = 'https://%s/oauth/request_token' % TWITTER_SERVER
+TWITTER_ACCESS_TOKEN_URL = 'https://%s/oauth/access_token' % TWITTER_SERVER
+TWITTER_AUTHORIZATION_URL = 'http://%s/oauth/authorize' % TWITTER_SERVER
+TWITTER_CHECK_AUTH = 'https://twitter.com/account/verify_credentials.json'
# Facebook configuration
-FACEBOOK_SERVER = 'graph.facebook.com'
+FACEBOOK_SERVER = 'graph.facebook.com'
FACEBOOK_AUTHORIZATION_URL = 'https://%s/oauth/authorize' % FACEBOOK_SERVER
-FACEBOOK_ACCESS_TOKEN_URL = 'https://%s/oauth/access_token' % FACEBOOK_SERVER
-FACEBOOK_CHECK_AUTH = 'https://%s/me' % FACEBOOK_SERVER
+FACEBOOK_ACCESS_TOKEN_URL = 'https://%s/oauth/access_token' % FACEBOOK_SERVER
+FACEBOOK_CHECK_AUTH = 'https://%s/me' % FACEBOOK_SERVER
# Orkut configuration
-ORKUT_SERVER = 'www.google.com'
-ORKUT_REQUEST_TOKEN_URL = 'https://%s/accounts/OAuthGetRequestToken' % ORKUT_SERVER
-ORKUT_ACCESS_TOKEN_URL = 'https://%s/accounts/OAuthGetAccessToken' % ORKUT_SERVER
-ORKUT_AUTHORIZATION_URL = 'https://%s/accounts/OAuthAuthorizeToken' % ORKUT_SERVER
-ORKUT_SCOPE = 'http://orkut.gmodules.com/social/'
-ORKUT_REST_ENDPOINT = 'http://www.orkut.com/social/rpc'
-ORKUT_EXTRA_DATA = ''
+ORKUT_SERVER = 'www.google.com'
+ORKUT_REQUEST_TOKEN_URL = 'https://%s/accounts/OAuthGetRequestToken' % \
+ ORKUT_SERVER
+ORKUT_ACCESS_TOKEN_URL = 'https://%s/accounts/OAuthGetAccessToken' % \
+ ORKUT_SERVER
+ORKUT_AUTHORIZATION_URL = 'https://%s/accounts/OAuthAuthorizeToken' % \
+ ORKUT_SERVER
+ORKUT_SCOPE = 'http://orkut.gmodules.com/social/'
+ORKUT_REST_ENDPOINT = 'http://www.orkut.com/social/rpc'
+ORKUT_EXTRA_DATA = ''
# OpenID configuration
OLD_AX_ATTRS = [
('http://axschema.org/namePerson/last', 'last_name'),
('http://axschema.org/namePerson/friendly', 'nickname'),
]
-AX_ATTRS = AX_SCHEMA_ATTRS + OLD_AX_ATTRS
-SREG_ATTR = ['email', 'fullname', 'nickname']
-OPENID_ID_FIELD = 'openid_identifier'
-SESSION_NAME = 'openid'
+AX_ATTRS = AX_SCHEMA_ATTRS + OLD_AX_ATTRS
+SREG_ATTR = ['email', 'fullname', 'nickname']
+OPENID_ID_FIELD = 'openid_identifier'
+SESSION_NAME = 'openid'
OPENID_GOOGLE_URL = 'https://www.google.com/accounts/o8/id'
-OPENID_YAHOO_URL = 'http://yahoo.com'
+OPENID_YAHOO_URL = 'http://yahoo.com'
if getattr(settings, 'SOCIAL_AUTH_USER_MODEL', None):
User = models.get_model(*settings.SOCIAL_AUTH_USER_MODEL.split('.'))
- missing = list(set(RECOMMENDED_FIELDS) -
+ missing = list(set(RECOMMENDED_FIELDS) -
set(User._meta.get_all_field_names())) + \
[name for name in RECOMMENDED_METHODS
if not callable(getattr(User, name, None))]
uid = models.CharField(max_length=255)
extra_data = models.TextField(default='', blank=True)
- def __unicode__(self):
- """Return associated user unicode representation"""
- return unicode(self.user)
-
class Meta:
"""Meta data"""
unique_together = ('provider', 'uid')
+ def __unicode__(self):
+ """Return associated user unicode representation"""
+ return unicode(self.user)
+
class Nonce(models.Model):
"""One use numbers"""
"""OpenId account association"""
server_url = models.TextField()
handle = models.CharField(max_length=255)
- secret = models.CharField(max_length=255) # Stored base64 encoded
+ secret = models.CharField(max_length=255) # Stored base64 encoded
issued = models.IntegerField()
lifetime = models.IntegerField()
assoc_type = models.CharField(max_length=64)
def __init__(self):
"""Init method"""
super(DjangoOpenIDStore, self).__init__()
- self.max_nonce_age = 6 * 60 * 60 # Six hours
+ self.max_nonce_age = 6 * 60 * 60 # Six hours
def storeAssociation(self, server_url, association):
"""Store new assocition if doesn't exist"""
else:
associations.append(association)
- if expired: # clear expired associations
+ if expired: # clear expired associations
Association.objects.filter(pk__in=expired).delete()
if associations:
def auth(request, backend):
"""Start authentication process"""
- complete = getattr(settings, 'SOCIAL_AUTH_COMPLETE_URL_NAME', 'complete')
+ complete_url = getattr(settings, 'SOCIAL_AUTH_COMPLETE_URL_NAME',
+ 'complete')
redirect = getattr(settings, 'LOGIN_REDIRECT_URL', '')
- return auth_process(request, backend, complete, redirect)
+ return auth_process(request, backend, complete_url, redirect)
def complete(request, backend):
@login_required
def associate(request, backend):
"""Authentication starting process"""
- complete = getattr(settings, 'SOCIAL_AUTH_ASSOCIATE_URL_NAME',
- 'associate_complete')
+ complete_url = getattr(settings, 'SOCIAL_AUTH_ASSOCIATE_URL_NAME',
+ 'associate_complete')
redirect = getattr(settings, 'LOGIN_REDIRECT_URL', '')
- return auth_process(request, backend, complete, redirect)
+ return auth_process(request, backend, complete_url, redirect)
@login_required