details = self.get_user_details(response)
uid = self.get_user_id(details, response)
is_new = False
+ user = kwargs.get('user')
+
try:
social_user = self.get_social_auth_user(uid)
except UserSocialAuth.DoesNotExist:
- user = kwargs.get('user')
if user is None: # new user
if not CREATE_USERS:
return None
# at this moment, merging account is not an option because that
# would imply update user references on other apps, that's too
# much intrusive
- if 'user' in kwargs and kwargs['user'] != social_user.user:
+ if user and user != social_user.user:
raise ValueError('Account already in use.', social_user)
user = social_user.user
def complete_process(request, backend):
"""Authentication complete process"""
- backend = get_backend(backend, request, request.path)
- if not backend:
- return HttpResponseServerError('Incorrect authentication service')
-
- try:
- user = backend.auth_complete()
- except ValueError, e: # some Authentication error ocurred
- user = None
- error_key = getattr(settings, 'SOCIAL_AUTH_ERROR_KEY', None)
- if error_key: # store error in session
- request.session[error_key] = str(e)
+ user = auth_complete(request, backend)
if user and getattr(user, 'is_active', True):
login(request, user)
if social_user.expiration_delta():
request.session.set_expiry(social_user.expiration_delta())
- # Remove URL possible redirect from session, if this is a new account,
- # send him to the new-users-page if any.
- url = request.session.pop(REDIRECT_FIELD_NAME, '') or DEFAULT_REDIRECT
- if NEW_USER_REDIRECT and getattr(user, 'is_new', False):
- url = NEW_USER_REDIRECT
-
# store last login backend name in session
request.session[SOCIAL_AUTH_LAST_LOGIN] = social_user.provider
+
+ # Remove possible redirect URL from session, if this is a new account,
+ # send him to the new-users-page if defined.
+ url = NEW_USER_REDIRECT if NEW_USER_REDIRECT and \
+ getattr(user, 'is_new', False) else \
+ request.session.pop(REDIRECT_FIELD_NAME, '') or \
+ DEFAULT_REDIRECT
else:
url = LOGIN_ERROR_URL
return HttpResponseRedirect(url)
@login_required
def associate_complete(request, backend):
"""Authentication complete process"""
- backend = get_backend(backend, request, request.path)
- if not backend:
- return HttpResponseServerError('Incorrect authentication service')
-
- try:
- backend.auth_complete(user=request.user)
- except ValueError, e: # some Authentication error ocurred
- user = None
- error_key = getattr(settings, 'SOCIAL_AUTH_ERROR_KEY', None)
- if error_key: # store error in session
- request.session[error_key] = str(e)
-
- url = request.session.pop(REDIRECT_FIELD_NAME, '') or DEFAULT_REDIRECT
- if NEW_ASSOCIATION_REDIRECT:
- url = NEW_ASSOCIATION_REDIRECT
+ if auth_complete(request, backend):
+ url = NEW_ASSOCIATION_REDIRECT if NEW_ASSOCIATION_REDIRECT else \
+ request.session.pop(REDIRECT_FIELD_NAME, '') or \
+ DEFAULT_REDIRECT
+ else:
+ url = LOGIN_ERROR_URL
return HttpResponseRedirect(url)
else:
return HttpResponse(backend.auth_html(),
content_type='text/html;charset=UTF-8')
+
+
+def auth_complete(request, backend):
+ """Complete auth process. Return authenticated user or None."""
+ backend = get_backend(backend, request, request.path)
+ if not backend:
+ return HttpResponseServerError('Incorrect authentication service')
+
+ user = request.user if request.user.is_authenticated() else None
+
+ try:
+ user = backend.auth_complete(user=user)
+ except ValueError, e: # some Authentication error ocurred
+ error_key = getattr(settings, 'SOCIAL_AUTH_ERROR_KEY', None)
+ if error_key: # store error in session
+ request.session[error_key] = str(e)
+ return user