1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-08-19 07:27:56 +00:00

redirect user back after login

This commit is contained in:
lian 2019-04-17 12:11:07 +08:00
parent 5a835ad397
commit 49ab2fb14a
3 changed files with 38 additions and 66 deletions

View File

@ -2,8 +2,8 @@ from django.conf import settings
from seahub.auth.backends import RemoteUserBackend from seahub.auth.backends import RemoteUserBackend
from seahub.base.accounts import User from seahub.base.accounts import User
from registration.models import ( from registration.models import (notify_admins_on_activate_request,
notify_admins_on_activate_request, notify_admins_on_register_complete) notify_admins_on_register_complete)
class OauthRemoteUserBackend(RemoteUserBackend): class OauthRemoteUserBackend(RemoteUserBackend):
@ -21,7 +21,9 @@ class OauthRemoteUserBackend(RemoteUserBackend):
# Create a User object if not already in the database? # Create a User object if not already in the database?
create_unknown_user = getattr(settings, 'OAUTH_CREATE_UNKNOWN_USER', True) create_unknown_user = getattr(settings, 'OAUTH_CREATE_UNKNOWN_USER', True)
# Create active user by default. # Create active user by default.
activate_after_creation = getattr(settings, 'OAUTH_ACTIVATE_USER_AFTER_CREATION', True) activate_after_creation = getattr(settings,
'OAUTH_ACTIVATE_USER_AFTER_CREATION',
True)
def get_user(self, username): def get_user(self, username):
try: try:

View File

@ -3,16 +3,12 @@
import os import os
import logging import logging
from django.http import HttpResponseRedirect from django.http import HttpResponseRedirect
from django.shortcuts import render
from django.core.urlresolvers import reverse
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from constance import config from seahub.api2.utils import get_api_token
from seahub.api2.utils import get_token_v1, get_token_v2
from seahub import auth from seahub import auth
from seahub.profile.models import Profile from seahub.profile.models import Profile
from seahub.utils import is_valid_email from seahub.utils import is_valid_email, render_error
from seahub.base.accounts import User from seahub.base.accounts import User
import seahub.settings as settings import seahub.settings as settings
@ -43,9 +39,11 @@ if ENABLE_OAUTH:
} }
ATTRIBUTE_MAP.update(getattr(settings, 'OAUTH_ATTRIBUTE_MAP', {})) ATTRIBUTE_MAP.update(getattr(settings, 'OAUTH_ATTRIBUTE_MAP', {}))
def oauth_check(func): def oauth_check(func):
""" Decorator for check if OAuth valid. """ Decorator for check if OAuth valid.
""" """
def _decorated(request): def _decorated(request):
error = False error = False
@ -68,14 +66,14 @@ def oauth_check(func):
error = True error = True
if error: if error:
return render(request, 'error.html', { return render_error(request,
'error_msg': _('Error, please contact administrator.'), _('Error, please contact administrator.'))
})
return func(request) return func(request)
return _decorated return _decorated
# https://requests-oauthlib.readthedocs.io/en/latest/examples/github.html # https://requests-oauthlib.readthedocs.io/en/latest/examples/github.html
# https://requests-oauthlib.readthedocs.io/en/latest/examples/google.html # https://requests-oauthlib.readthedocs.io/en/latest/examples/google.html
@oauth_check @oauth_check
@ -85,22 +83,22 @@ def oauth_login(request):
using an URL with a few key OAuth parameters. using an URL with a few key OAuth parameters.
""" """
session = OAuth2Session(client_id=CLIENT_ID, session = OAuth2Session(client_id=CLIENT_ID,
scope=SCOPE, redirect_uri=REDIRECT_URL) scope=SCOPE,
redirect_uri=REDIRECT_URL)
try: try:
authorization_url, state = session.authorization_url( authorization_url, state = session.authorization_url(AUTHORIZATION_URL)
AUTHORIZATION_URL)
except Exception as e: except Exception as e:
logger.error(e) logger.error(e)
return render(request, 'error.html', { return render_error(request, _('Error, please contact administrator.'))
'error_msg': _('Error, please contact administrator.'),
})
request.session['oauth_state'] = state request.session['oauth_state'] = state
request.session['oauth_redirect'] = request.GET.get(
auth.REDIRECT_FIELD_NAME, '/')
return HttpResponseRedirect(authorization_url) return HttpResponseRedirect(authorization_url)
# Step 2: User authorization, this happens on the provider.
# Step 2: User authorization, this happens on the provider.
@oauth_check @oauth_check
def oauth_callback(request): def oauth_callback(request):
""" Step 3: Retrieving an access token. """ Step 3: Retrieving an access token.
@ -108,31 +106,34 @@ def oauth_callback(request):
callback URL. With this redirection comes an authorization code included callback URL. With this redirection comes an authorization code included
in the redirect URL. We will use that to obtain an access token. in the redirect URL. We will use that to obtain an access token.
""" """
session = OAuth2Session(client_id=CLIENT_ID, scope=SCOPE, session = OAuth2Session(client_id=CLIENT_ID,
scope=SCOPE,
state=request.session.get('oauth_state', None), state=request.session.get('oauth_state', None),
redirect_uri=REDIRECT_URL) redirect_uri=REDIRECT_URL)
try: try:
token = session.fetch_token(TOKEN_URL, client_secret=CLIENT_SECRET, token = session.fetch_token(
authorization_response=request.get_full_path()) TOKEN_URL,
client_secret=CLIENT_SECRET,
authorization_response=request.get_full_path())
if session._client.__dict__['token'].has_key('user_id'): if session._client.__dict__['token'].has_key('user_id'):
# used for sjtu.edu.cn # used for sjtu.edu.cn
# https://xjq12311.gitbooks.io/sjtu-engtc/content/ # https://xjq12311.gitbooks.io/sjtu-engtc/content/
user_id = session._client.__dict__['token']['user_id'] user_id = session._client.__dict__['token']['user_id']
user_info_resp = session.get(USER_INFO_URL + '?user_id=%s' % user_id) user_info_resp = session.get(USER_INFO_URL +
'?user_id=%s' % user_id)
else: else:
user_info_url = USER_INFO_URL user_info_url = USER_INFO_URL
if ACCESS_TOKEN_IN_URI: if ACCESS_TOKEN_IN_URI:
code = request.GET.get('code') code = request.GET.get('code')
user_info_url = USER_INFO_URL + '?access_token=%s&code=%s' % (token['access_token'], code) user_info_url = USER_INFO_URL + '?access_token=%s&code=%s' % (
token['access_token'], code)
user_info_resp = session.get(user_info_url) user_info_resp = session.get(user_info_url)
except Exception as e: except Exception as e:
logger.error(e) logger.error(e)
return render(request, 'error.html', { return render_error(request, _('Error, please contact administrator.'))
'error_msg': _('Error, please contact administrator.'),
})
def format_user_info(user_info_resp): def format_user_info(user_info_resp):
logger.info('user info resp: %s' % user_info_resp.text) logger.info('user info resp: %s' % user_info_resp.text)
@ -160,22 +161,11 @@ def oauth_callback(request):
if error: if error:
logger.error('Required user info not found.') logger.error('Required user info not found.')
logger.error(user_info) logger.error(user_info)
return render(request, 'error.html', { return render_error(request, _('Error, please contact administrator.'))
'error_msg': _('Error, please contact administrator.'),
})
# seahub authenticate user # seahub authenticate user
email = user_info['email'] email = user_info['email']
try:
User.objects.get(email=email)
except User.DoesNotExist:
if not config.ENABLE_SIGNUP:
logger.error('%s not found but user registration is disabled.' % email)
return render(request, 'error.html', {
'error_msg': _('Error, please contact administrator.'),
})
try: try:
user = auth.authenticate(remote_user=email) user = auth.authenticate(remote_user=email)
except User.DoesNotExist: except User.DoesNotExist:
@ -184,16 +174,12 @@ def oauth_callback(request):
if not user or not user.is_active: if not user or not user.is_active:
logger.error('User %s not found or inactive.' % email) logger.error('User %s not found or inactive.' % email)
# a page for authenticate user failed # a page for authenticate user failed
return render(request, 'error.html', { return render_error(request, _(u'User %s not found.') % email)
'error_msg': _(u'User %s not found.') % email
})
# User is valid. Set request.user and persist user in the session # User is valid. Set request.user and persist user in the session
# by logging the user in. # by logging the user in.
request.user = user request.user = user
auth.login(request, user) auth.login(request, user)
user.set_unusable_password()
user.save()
# update user's profile # update user's profile
name = user_info['name'] if user_info.has_key('name') else '' name = user_info['name'] if user_info.has_key('name') else ''
@ -213,27 +199,9 @@ def oauth_callback(request):
profile.save() profile.save()
# generate auth token for Seafile client # generate auth token for Seafile client
keys = ( api_token = get_api_token(request)
'platform',
'device_id',
'device_name',
'client_version',
'platform_version',
)
if all([key in request.GET for key in keys]):
platform = request.GET['platform']
device_id = request.GET['device_id']
device_name = request.GET['device_name']
client_version = request.GET['client_version']
platform_version = request.GET['platform_version']
token = get_token_v2(
request, request.user.username, platform, device_id,
device_name, client_version, platform_version)
else:
token = get_token_v1(request.user.username)
# redirect user to home page # redirect user to home page
response = HttpResponseRedirect(reverse('libraries')) response = HttpResponseRedirect(request.session['oauth_redirect'])
response.set_cookie('seahub_auth', email + '@' + token.key) response.set_cookie('seahub_auth', email + '@' + api_token.key)
return response return response

View File

@ -276,7 +276,6 @@ CONSTANCE_DATABASE_CACHE_BACKEND = 'default'
AUTHENTICATION_BACKENDS = ( AUTHENTICATION_BACKENDS = (
'seahub.social_core.backends.weixin_enterprise.WeixinWorkOAuth2', 'seahub.social_core.backends.weixin_enterprise.WeixinWorkOAuth2',
'seahub.base.accounts.AuthBackend', 'seahub.base.accounts.AuthBackend',
'seahub.oauth.backends.OauthRemoteUserBackend',
) )
SOCIAL_AUTH_URL_NAMESPACE = 'social' SOCIAL_AUTH_URL_NAMESPACE = 'social'
@ -905,3 +904,6 @@ CONSTANCE_CONFIG = {
if ENABLE_REMOTE_USER_AUTHENTICATION: if ENABLE_REMOTE_USER_AUTHENTICATION:
MIDDLEWARE_CLASSES += ('seahub.auth.middleware.SeafileRemoteUserMiddleware',) MIDDLEWARE_CLASSES += ('seahub.auth.middleware.SeafileRemoteUserMiddleware',)
AUTHENTICATION_BACKENDS += ('seahub.auth.backends.SeafileRemoteUserBackend',) AUTHENTICATION_BACKENDS += ('seahub.auth.backends.SeafileRemoteUserBackend',)
if ENABLE_OAUTH:
AUTHENTICATION_BACKENDS += ('seahub.oauth.backends.OauthRemoteUserBackend',)