diff --git a/apps/auth1/services.py b/apps/auth1/services.py index 29eb6e9..8bff64a 100644 --- a/apps/auth1/services.py +++ b/apps/auth1/services.py @@ -12,6 +12,26 @@ def check_phone_code(phone, code, raise_exception=True): return False +def check_email_code(email, code, raise_exception=True): + """验证邮箱验证码 + + Args: + email: 邮箱地址 + code: 验证码 + raise_exception: 是否抛出异常 + + Returns: + bool: 验证码是否正确 + """ + cache_key = f'email_code_{email}' + code_exist = cache.get(cache_key, None) + if code_exist == code: + return True + if raise_exception: + raise ParseError('验证码错误或已过期') + return False + + def validate_password(password): # 正则表达式匹配规则 diff --git a/apps/auth1/urls.py b/apps/auth1/urls.py index 8402f29..b7672f0 100755 --- a/apps/auth1/urls.py +++ b/apps/auth1/urls.py @@ -3,7 +3,7 @@ from django.urls import path from rest_framework_simplejwt.views import TokenRefreshView from apps.auth1.views import (CodeLogin, LoginView, LogoutView, PwResetView, - SecretLogin, SendCode, TokenBlackView, WxLogin, WxmpLogin, TokenLoginView, FaceLoginView) + SecretLogin, SendCode, TokenBlackView, WxLogin, WxmpLogin, TokenLoginView, FaceLoginView, EmailCodeLogin) from apps.auth1.register_view import RegisterView from apps.auth1.email_code_view import EmailCodeView @@ -22,5 +22,6 @@ urlpatterns = [ path(API_BASE_URL + 'reset_password/', PwResetView.as_view(), name='reset_password'), path(API_BASE_URL + 'login_face/', FaceLoginView.as_view(), name='face_login'), path(API_BASE_URL + 'email_code/', EmailCodeView.as_view(), name='email_code'), + path(API_BASE_URL + 'login_email_code/', EmailCodeLogin.as_view(), name='login_email_code'), path(API_BASE_URL + 'register/', RegisterView.as_view(), name='register') ] diff --git a/apps/auth1/views.py b/apps/auth1/views.py index 344709e..9103f81 100755 --- a/apps/auth1/views.py +++ b/apps/auth1/views.py @@ -9,7 +9,7 @@ from rest_framework.permissions import IsAuthenticated from apps.auth1.errors import USERNAME_OR_PASSWORD_WRONG from rest_framework_simplejwt.tokens import RefreshToken from django.core.cache import cache -from apps.auth1.services import check_phone_code +from apps.auth1.services import check_phone_code, check_email_code from apps.utils.tools import rannum from apps.utils.wxmp import wxmpClient @@ -212,6 +212,26 @@ class CodeLogin(CreateAPIView): raise ParseError('账户不存在或已禁用') +class EmailCodeLogin(CreateAPIView): + """邮箱验证码登录 + + 邮箱验证码登录 + """ + authentication_classes = [] + permission_classes = [] + serializer_class = EmailCodeLoginSerializer + + def post(self, request): + email = request.data['email'] + code = request.data['code'] + check_email_code(email, code) + user = User.objects.filter(username=email).first() + if user: + ret = get_tokens_for_user(user) + return Response(ret) + raise ParseError('账户不存在或已禁用') + + class SecretLogin(CreateAPIView): """App端密钥登录