This commit is contained in:
virusdefender 2018-05-06 01:06:49 +08:00
parent c9563506ef
commit e843404c5f
3 changed files with 25 additions and 6 deletions

View File

@ -119,7 +119,6 @@ class ResetPasswordSerializer(serializers.Serializer):
class SSOSerializer(serializers.Serializer): class SSOSerializer(serializers.Serializer):
appkey = serializers.CharField()
token = serializers.CharField() token = serializers.CharField()

View File

@ -5,7 +5,7 @@ from ..views.oj import (ApplyResetPasswordAPI, ResetPasswordAPI,
UserLoginAPI, UserLogoutAPI, UsernameOrEmailCheck, UserLoginAPI, UserLogoutAPI, UsernameOrEmailCheck,
AvatarUploadAPI, TwoFactorAuthAPI, UserProfileAPI, AvatarUploadAPI, TwoFactorAuthAPI, UserProfileAPI,
UserRankAPI, CheckTFARequiredAPI, SessionManagementAPI, UserRankAPI, CheckTFARequiredAPI, SessionManagementAPI,
ProfileProblemDisplayIDRefreshAPI, OpenAPIAppkeyAPI) ProfileProblemDisplayIDRefreshAPI, OpenAPIAppkeyAPI, SSOAPI)
from utils.captcha.views import CaptchaAPIView from utils.captcha.views import CaptchaAPIView
@ -27,4 +27,5 @@ urlpatterns = [
url(r"^user_rank/?$", UserRankAPI.as_view(), name="user_rank_api"), url(r"^user_rank/?$", UserRankAPI.as_view(), name="user_rank_api"),
url(r"^sessions/?$", SessionManagementAPI.as_view(), name="session_management_api"), url(r"^sessions/?$", SessionManagementAPI.as_view(), name="session_management_api"),
url(r"^open_api_appkey/?$", OpenAPIAppkeyAPI.as_view(), name="open_api_appkey_api"), url(r"^open_api_appkey/?$", OpenAPIAppkeyAPI.as_view(), name="open_api_appkey_api"),
url(r"^sso?$", SSOAPI.as_view(), name="sso_api")
] ]

View File

@ -5,16 +5,17 @@ from importlib import import_module
import qrcode import qrcode
from django.conf import settings from django.conf import settings
from django.contrib import auth from django.contrib import auth
from django.http import HttpResponseRedirect
from django.template.loader import render_to_string from django.template.loader import render_to_string
from django.utils.decorators import method_decorator from django.utils.decorators import method_decorator
from django.utils.timezone import now from django.utils.timezone import now
from django.views.decorators.csrf import ensure_csrf_cookie from django.views.decorators.csrf import ensure_csrf_cookie, csrf_exempt
from otpauth import OtpAuth from otpauth import OtpAuth
from problem.models import Problem from problem.models import Problem
from utils.constants import ContestRuleType from utils.constants import ContestRuleType
from options.options import SysOptions from options.options import SysOptions
from utils.api import APIView, validate_serializer from utils.api import APIView, validate_serializer, CSRFExemptAPIView
from utils.captcha import Captcha from utils.captcha import Captcha
from utils.shortcuts import rand_str, img2base64, datetime2str from utils.shortcuts import rand_str, img2base64, datetime2str
from ..decorators import login_required from ..decorators import login_required
@ -22,7 +23,7 @@ from ..models import User, UserProfile, AdminType
from ..serializers import (ApplyResetPasswordSerializer, ResetPasswordSerializer, from ..serializers import (ApplyResetPasswordSerializer, ResetPasswordSerializer,
UserChangePasswordSerializer, UserLoginSerializer, UserChangePasswordSerializer, UserLoginSerializer,
UserRegisterSerializer, UsernameOrEmailCheckSerializer, UserRegisterSerializer, UsernameOrEmailCheckSerializer,
RankInfoSerializer, UserChangeEmailSerializer) RankInfoSerializer, UserChangeEmailSerializer, SSOSerializer)
from ..serializers import (TwoFactorAuthCodeSerializer, UserProfileSerializer, from ..serializers import (TwoFactorAuthCodeSerializer, UserProfileSerializer,
EditUserProfileSerializer, ImageUploadForm) EditUserProfileSerializer, ImageUploadForm)
from ..tasks import send_email_async from ..tasks import send_email_async
@ -411,8 +412,26 @@ class OpenAPIAppkeyAPI(APIView):
def post(self, request): def post(self, request):
user = request.user user = request.user
if not user.open_api: if not user.open_api:
return self.error("Permission denied") return self.error("OpenAPI function is truned off for you")
api_appkey = rand_str() api_appkey = rand_str()
user.open_api_appkey = api_appkey user.open_api_appkey = api_appkey
user.save() user.save()
return self.success({"appkey": api_appkey}) return self.success({"appkey": api_appkey})
class SSOAPI(CSRFExemptAPIView):
@login_required
def get(self, request):
token = rand_str()
request.user.auth_token = token
request.user.save()
return self.success({"token": token})
@method_decorator(csrf_exempt)
@validate_serializer(SSOSerializer)
def post(self, request):
try:
user = User.objects.get(auth_token=request.data["token"])
except User.DoesNotExist:
return self.error("User does not exist")
return self.success({"username": user.username, "avatar": user.userprofile.avatar, "admin_type": user.admin_type})