|
|
@ -5,13 +5,13 @@ from api.utils.serializer import UserInfoSerializer |
|
|
|
from django.core.cache import cache |
|
|
|
from django.core.cache import cache |
|
|
|
from rest_framework.views import APIView |
|
|
|
from rest_framework.views import APIView |
|
|
|
import binascii |
|
|
|
import binascii |
|
|
|
import os, datetime, re |
|
|
|
import os, datetime, json |
|
|
|
from api.utils.utils import get_captcha, valid_captcha, is_valid_domain |
|
|
|
from api.utils.utils import get_captcha, valid_captcha, is_valid_domain, is_valid_phone, \ |
|
|
|
from api.utils.TokenManager import DownloadToken, generateNumericTokenOfLength |
|
|
|
get_sender_sms_token, is_valid_email, is_valid_sender_code, get_sender_email_token |
|
|
|
from api.utils.auth import ExpiringTokenAuthentication |
|
|
|
from api.utils.auth import ExpiringTokenAuthentication |
|
|
|
from api.utils.response import BaseResponse |
|
|
|
from api.utils.response import BaseResponse |
|
|
|
from django.middleware import csrf |
|
|
|
from django.middleware import csrf |
|
|
|
from fir_ser.settings import CACHE_KEY_TEMPLATE, SERVER_DOMAIN |
|
|
|
from fir_ser.settings import CACHE_KEY_TEMPLATE, SERVER_DOMAIN, REGISTER |
|
|
|
from api.utils.storage.caches import login_auth_failed, set_default_app_wx_easy |
|
|
|
from api.utils.storage.caches import login_auth_failed, set_default_app_wx_easy |
|
|
|
import logging |
|
|
|
import logging |
|
|
|
|
|
|
|
|
|
|
@ -30,53 +30,51 @@ class LoginView(APIView): |
|
|
|
def post(self, request): |
|
|
|
def post(self, request): |
|
|
|
response = BaseResponse() |
|
|
|
response = BaseResponse() |
|
|
|
receive = request.data |
|
|
|
receive = request.data |
|
|
|
|
|
|
|
username = receive.get("username", None) |
|
|
|
if request.method == 'POST': |
|
|
|
is_valid = valid_captcha(receive.get("cptch_key", None), receive.get("authcode", None), username) |
|
|
|
username = receive.get("username", None) |
|
|
|
if is_valid: |
|
|
|
is_valid = valid_captcha(receive.get("cptch_key", None), receive.get("authcode", None), username) |
|
|
|
if login_auth_failed("get", username): |
|
|
|
if is_valid: |
|
|
|
password = receive.get("password") |
|
|
|
if login_auth_failed("get", username): |
|
|
|
user = auth.authenticate(username=username, password=password) |
|
|
|
password = receive.get("password") |
|
|
|
logger.info("username:%s password:%s" % (username, password)) |
|
|
|
user = auth.authenticate(username=username, password=password) |
|
|
|
if user is not None: |
|
|
|
logger.info("username:%s password:%s" % (username, password)) |
|
|
|
if user.is_active: |
|
|
|
if user is not None: |
|
|
|
login_auth_failed("del", username) |
|
|
|
if user.is_active: |
|
|
|
# update the token |
|
|
|
login_auth_failed("del", username) |
|
|
|
key = self.generate_key() |
|
|
|
# update the token |
|
|
|
now = datetime.datetime.now() |
|
|
|
key = self.generate_key() |
|
|
|
user_info = UserInfo.objects.get(pk=user.pk) |
|
|
|
now = datetime.datetime.now() |
|
|
|
|
|
|
|
user_info = UserInfo.objects.get(pk=user.pk) |
|
|
|
auth_key = "_".join([CACHE_KEY_TEMPLATE.get('user_auth_token_key'), key]) |
|
|
|
|
|
|
|
cache.set(auth_key, {'uid': user_info.uid, 'username': user_info.username}, 3600 * 24 * 7) |
|
|
|
auth_key = "_".join([CACHE_KEY_TEMPLATE.get('user_auth_token_key'), key]) |
|
|
|
Token.objects.create(user=user, **{"access_token": key, "created": now}) |
|
|
|
cache.set(auth_key, {'uid': user_info.uid, 'username': user_info.username}, 3600 * 24 * 7) |
|
|
|
|
|
|
|
Token.objects.create(user=user, **{"access_token": key, "created": now}) |
|
|
|
serializer = UserInfoSerializer(user_info, ) |
|
|
|
|
|
|
|
data = serializer.data |
|
|
|
serializer = UserInfoSerializer(user_info, ) |
|
|
|
response.msg = "验证成功!" |
|
|
|
data = serializer.data |
|
|
|
response.userinfo = data |
|
|
|
response.msg = "验证成功!" |
|
|
|
response.token = key |
|
|
|
response.userinfo = data |
|
|
|
|
|
|
|
response.token = key |
|
|
|
|
|
|
|
else: |
|
|
|
|
|
|
|
response.msg = "用户被禁用" |
|
|
|
|
|
|
|
response.code = 1005 |
|
|
|
|
|
|
|
else: |
|
|
|
else: |
|
|
|
login_auth_failed("set", username) |
|
|
|
response.msg = "用户被禁用" |
|
|
|
try: |
|
|
|
response.code = 1005 |
|
|
|
UserInfo.objects.get(username=username) |
|
|
|
|
|
|
|
response.msg = "密码或者账户有误" |
|
|
|
|
|
|
|
response.code = 1002 |
|
|
|
|
|
|
|
except UserInfo.DoesNotExist: |
|
|
|
|
|
|
|
response.msg = "用户不存在!" |
|
|
|
|
|
|
|
response.code = 1003 |
|
|
|
|
|
|
|
else: |
|
|
|
else: |
|
|
|
response.code = 1006 |
|
|
|
login_auth_failed("set", username) |
|
|
|
logger.error("username:%s failed too try , locked" % (username,)) |
|
|
|
try: |
|
|
|
response.msg = "用户登录失败次数过多,已被锁定,请1小时之后再次尝试" |
|
|
|
UserInfo.objects.get(username=username) |
|
|
|
|
|
|
|
response.msg = "密码或者账户有误" |
|
|
|
|
|
|
|
response.code = 1002 |
|
|
|
|
|
|
|
except UserInfo.DoesNotExist: |
|
|
|
|
|
|
|
response.msg = "用户不存在!" |
|
|
|
|
|
|
|
response.code = 1003 |
|
|
|
else: |
|
|
|
else: |
|
|
|
response.code = 1001 |
|
|
|
response.code = 1006 |
|
|
|
response.msg = "验证码有误" |
|
|
|
logger.error("username:%s failed too try , locked" % (username,)) |
|
|
|
|
|
|
|
response.msg = "用户登录失败次数过多,已被锁定,请1小时之后再次尝试" |
|
|
|
|
|
|
|
else: |
|
|
|
|
|
|
|
response.code = 1001 |
|
|
|
|
|
|
|
response.msg = "验证码有误" |
|
|
|
|
|
|
|
|
|
|
|
return Response(response.dict) |
|
|
|
return Response(response.dict) |
|
|
|
|
|
|
|
|
|
|
|
def get(self, request): |
|
|
|
def get(self, request): |
|
|
|
response = BaseResponse() |
|
|
|
response = BaseResponse() |
|
|
@ -93,21 +91,28 @@ class RegistView(APIView): |
|
|
|
receive = request.data |
|
|
|
receive = request.data |
|
|
|
|
|
|
|
|
|
|
|
username = receive.get("username", None) |
|
|
|
username = receive.get("username", None) |
|
|
|
is_valid = valid_captcha(receive.get("cptch_key", None), receive.get("authcode", None), username) |
|
|
|
act = 'sms' |
|
|
|
if is_valid: |
|
|
|
if is_valid_email(username): |
|
|
|
|
|
|
|
act = 'email' |
|
|
|
|
|
|
|
is_valid, target = is_valid_sender_code(act, receive.get("auth_token", None), receive.get("auth_key", None)) |
|
|
|
|
|
|
|
if is_valid and str(target) == str(username): |
|
|
|
if login_auth_failed("get", username): |
|
|
|
if login_auth_failed("get", username): |
|
|
|
password = receive.get("password") |
|
|
|
password = receive.get("password") |
|
|
|
password2 = receive.get("password2") |
|
|
|
password2 = receive.get("password2") |
|
|
|
if password == password2: |
|
|
|
if password == password2: |
|
|
|
|
|
|
|
|
|
|
|
try: |
|
|
|
try: |
|
|
|
UserInfo.objects.get(username=username) |
|
|
|
UserInfo.objects.get(username=username) |
|
|
|
login_auth_failed("set", username) |
|
|
|
login_auth_failed("set", username) |
|
|
|
response.msg = "邮箱已经存在,请更换其他邮箱" |
|
|
|
response.msg = "邮箱已经存在,请更换其他邮箱" |
|
|
|
response.code = 1002 |
|
|
|
response.code = 1002 |
|
|
|
except UserInfo.DoesNotExist: |
|
|
|
except UserInfo.DoesNotExist: |
|
|
|
user_obj = UserInfo.objects.create_user(username, email=username, password=password, |
|
|
|
if is_valid_email(username): |
|
|
|
first_name=username[:8]) |
|
|
|
|
|
|
|
|
|
|
|
user_obj = UserInfo.objects.create_user(username, email=username, password=password, |
|
|
|
|
|
|
|
first_name=username[:8]) |
|
|
|
|
|
|
|
else: |
|
|
|
|
|
|
|
user_obj = UserInfo.objects.create_user(username, mobile=username, password=password, |
|
|
|
|
|
|
|
first_name=username[:8]) |
|
|
|
if user_obj: |
|
|
|
if user_obj: |
|
|
|
response.msg = "注册成功" |
|
|
|
response.msg = "注册成功" |
|
|
|
response.code = 1000 |
|
|
|
response.code = 1000 |
|
|
@ -120,13 +125,18 @@ class RegistView(APIView): |
|
|
|
response.msg = "用户注册失败次数过多,已被锁定,请1小时之后再次尝试" |
|
|
|
response.msg = "用户注册失败次数过多,已被锁定,请1小时之后再次尝试" |
|
|
|
else: |
|
|
|
else: |
|
|
|
response.code = 1001 |
|
|
|
response.code = 1001 |
|
|
|
response.msg = "验证码有误" |
|
|
|
response.msg = "邮件或短信验证码有误" |
|
|
|
|
|
|
|
|
|
|
|
return Response(response.dict) |
|
|
|
return Response(response.dict) |
|
|
|
|
|
|
|
|
|
|
|
def get(self, request): |
|
|
|
def get(self, request): |
|
|
|
response = BaseResponse() |
|
|
|
response = BaseResponse() |
|
|
|
response.data = get_captcha() |
|
|
|
response.data = {} |
|
|
|
|
|
|
|
allow_f = REGISTER.get("enable") |
|
|
|
|
|
|
|
if allow_f: |
|
|
|
|
|
|
|
response.data = get_captcha() |
|
|
|
|
|
|
|
response.data['ways'] = REGISTER.get("ways") |
|
|
|
|
|
|
|
response.data['enable'] = allow_f |
|
|
|
return Response(response.dict) |
|
|
|
return Response(response.dict) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -137,13 +147,6 @@ class UserInfoView(APIView): |
|
|
|
res = BaseResponse() |
|
|
|
res = BaseResponse() |
|
|
|
serializer = UserInfoSerializer(request.user) |
|
|
|
serializer = UserInfoSerializer(request.user) |
|
|
|
res.data = serializer.data |
|
|
|
res.data = serializer.data |
|
|
|
act = request.query_params.get("act", None) |
|
|
|
|
|
|
|
if act and act == "sms": |
|
|
|
|
|
|
|
sms_token_obj = DownloadToken() |
|
|
|
|
|
|
|
sms_code = generateNumericTokenOfLength(6) |
|
|
|
|
|
|
|
sms_token = sms_token_obj.make_token(sms_code) |
|
|
|
|
|
|
|
res.data["sms_token"] = sms_token |
|
|
|
|
|
|
|
res.data["sms_code"] = sms_code |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return Response(res.dict) |
|
|
|
return Response(res.dict) |
|
|
|
|
|
|
|
|
|
|
@ -211,18 +214,21 @@ class UserInfoView(APIView): |
|
|
|
request.user.job = data.get("job", request.user.job) |
|
|
|
request.user.job = data.get("job", request.user.job) |
|
|
|
request.user.first_name = data.get("first_name", request.user.first_name) |
|
|
|
request.user.first_name = data.get("first_name", request.user.first_name) |
|
|
|
|
|
|
|
|
|
|
|
sms_token = data.get("sms_token", None) |
|
|
|
sms_token = data.get("auth_token", None) |
|
|
|
if sms_token: |
|
|
|
if sms_token: |
|
|
|
sms_token_obj = DownloadToken() |
|
|
|
status, target = is_valid_sender_code(request.user.uid, sms_token, data.get("sms_code", None)) |
|
|
|
if sms_token_obj.verify_token(sms_token, data.get("sms_code", None)): |
|
|
|
mobile = data.get("mobile", request.user.mobile) |
|
|
|
mobile = data.get("mobile", request.user.mobile) |
|
|
|
if target == mobile: |
|
|
|
phone_pat = re.compile('^(13\d|14[5|7]|15\d|166|17[3|6|7]|18\d)\d{8}$') |
|
|
|
if is_valid_phone(mobile): |
|
|
|
if mobile and re.search(phone_pat, mobile): |
|
|
|
|
|
|
|
request.user.mobile = data.get("mobile", request.user.mobile) |
|
|
|
request.user.mobile = data.get("mobile", request.user.mobile) |
|
|
|
else: |
|
|
|
else: |
|
|
|
res.code = 1005 |
|
|
|
res.code = 1005 |
|
|
|
res.msg = "手机号校验失败" |
|
|
|
res.msg = "手机号异常" |
|
|
|
return Response(res.dict) |
|
|
|
return Response(res.dict) |
|
|
|
|
|
|
|
else: |
|
|
|
|
|
|
|
res.code = 1005 |
|
|
|
|
|
|
|
res.msg = "手机号校验失败" |
|
|
|
|
|
|
|
return Response(res.dict) |
|
|
|
|
|
|
|
|
|
|
|
try: |
|
|
|
try: |
|
|
|
request.user.save() |
|
|
|
request.user.save() |
|
|
@ -238,3 +244,132 @@ class UserInfoView(APIView): |
|
|
|
return Response(res.dict) |
|
|
|
return Response(res.dict) |
|
|
|
|
|
|
|
|
|
|
|
return Response(res.dict) |
|
|
|
return Response(res.dict) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class AuthorizationView(APIView): |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get(self, request): |
|
|
|
|
|
|
|
res = BaseResponse() |
|
|
|
|
|
|
|
res.data = {} |
|
|
|
|
|
|
|
act = request.query_params.get("act", None) |
|
|
|
|
|
|
|
target = request.query_params.get("target", None) |
|
|
|
|
|
|
|
ext = request.query_params.get("ext", None) |
|
|
|
|
|
|
|
if ext: |
|
|
|
|
|
|
|
ext = json.loads(ext) |
|
|
|
|
|
|
|
ways = REGISTER.get("ways") |
|
|
|
|
|
|
|
if ways.get('code') and ext and ext.get('icode'): |
|
|
|
|
|
|
|
if ext.get('icode') == '689888666': |
|
|
|
|
|
|
|
pass |
|
|
|
|
|
|
|
else: |
|
|
|
|
|
|
|
res.code = 1008 |
|
|
|
|
|
|
|
res.msg = "邀请码已失效" |
|
|
|
|
|
|
|
return Response(res.dict) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if ext and valid_captcha(ext.get("cptch_key", None), ext.get("authcode", None), target): |
|
|
|
|
|
|
|
pass |
|
|
|
|
|
|
|
else: |
|
|
|
|
|
|
|
res.code = 1008 |
|
|
|
|
|
|
|
res.msg = "图片验证码有误" |
|
|
|
|
|
|
|
return Response(res.dict) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
times_key = "register_%s_%s" % (act, target) |
|
|
|
|
|
|
|
if act == "sms": |
|
|
|
|
|
|
|
if is_valid_phone(target): |
|
|
|
|
|
|
|
if login_auth_failed("get", times_key): |
|
|
|
|
|
|
|
login_auth_failed("set", times_key) |
|
|
|
|
|
|
|
if UserInfo.objects.filter(mobile=target): |
|
|
|
|
|
|
|
res.code = 1005 |
|
|
|
|
|
|
|
res.msg = "手机号已经存在" |
|
|
|
|
|
|
|
else: |
|
|
|
|
|
|
|
token, code = get_sender_sms_token(act, target) |
|
|
|
|
|
|
|
res.data["auth_token"] = token |
|
|
|
|
|
|
|
else: |
|
|
|
|
|
|
|
res.code = 1009 |
|
|
|
|
|
|
|
res.msg = "该手机号今日注册次数已经达到上限" |
|
|
|
|
|
|
|
else: |
|
|
|
|
|
|
|
res.code = 1005 |
|
|
|
|
|
|
|
res.msg = "手机号校验失败" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
elif act == "email": |
|
|
|
|
|
|
|
if is_valid_email(target): |
|
|
|
|
|
|
|
if login_auth_failed("get", times_key): |
|
|
|
|
|
|
|
login_auth_failed("set", times_key) |
|
|
|
|
|
|
|
if UserInfo.objects.filter(email=target): |
|
|
|
|
|
|
|
res.code = 1005 |
|
|
|
|
|
|
|
res.msg = "邮箱已经存在" |
|
|
|
|
|
|
|
else: |
|
|
|
|
|
|
|
token, code = get_sender_email_token(act, target) |
|
|
|
|
|
|
|
res.data["auth_token"] = token |
|
|
|
|
|
|
|
else: |
|
|
|
|
|
|
|
res.code = 1009 |
|
|
|
|
|
|
|
res.msg = "该邮箱今日注册次数已经达到上限" |
|
|
|
|
|
|
|
else: |
|
|
|
|
|
|
|
res.code = 1006 |
|
|
|
|
|
|
|
res.msg = "邮箱校验失败" |
|
|
|
|
|
|
|
elif act == "ways": |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if ways['sms']: |
|
|
|
|
|
|
|
pass |
|
|
|
|
|
|
|
elif ways['email']: |
|
|
|
|
|
|
|
pass |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
elif ways['code']: |
|
|
|
|
|
|
|
pass |
|
|
|
|
|
|
|
else: |
|
|
|
|
|
|
|
pass |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
else: |
|
|
|
|
|
|
|
res.code = 1007 |
|
|
|
|
|
|
|
res.msg = "信息发送失败" |
|
|
|
|
|
|
|
return Response(res.dict) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class AuthorizationViewbak(APIView): |
|
|
|
|
|
|
|
# authentication_classes = [ExpiringTokenAuthentication, ] |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get(self, request): |
|
|
|
|
|
|
|
res = BaseResponse() |
|
|
|
|
|
|
|
res.data = {} |
|
|
|
|
|
|
|
act = request.query_params.get("act", None) |
|
|
|
|
|
|
|
target = request.query_params.get("target", None) |
|
|
|
|
|
|
|
ext = request.query_params.get("ext", None) |
|
|
|
|
|
|
|
ways = REGISTER.get("ways") |
|
|
|
|
|
|
|
if ways.get('code') and ext: |
|
|
|
|
|
|
|
if ext == '689888666': |
|
|
|
|
|
|
|
pass |
|
|
|
|
|
|
|
else: |
|
|
|
|
|
|
|
res.code = 1008 |
|
|
|
|
|
|
|
res.msg = "邀请码已失效" |
|
|
|
|
|
|
|
return Response(res.dict) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if act == "sms": |
|
|
|
|
|
|
|
if is_valid_phone(target) and str(request.user.mobile) != str(target): |
|
|
|
|
|
|
|
token, code = get_sender_sms_token(request.user.uid, target) |
|
|
|
|
|
|
|
res.data["auth_token"] = token |
|
|
|
|
|
|
|
else: |
|
|
|
|
|
|
|
res.code = 1005 |
|
|
|
|
|
|
|
res.msg = "手机号校验失败" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
elif act == "email": |
|
|
|
|
|
|
|
if is_valid_email(target) and str(request.user.email) != str(target): |
|
|
|
|
|
|
|
token, code = get_sender_email_token(request.user.uid, target) |
|
|
|
|
|
|
|
res.data["auth_token"] = token |
|
|
|
|
|
|
|
else: |
|
|
|
|
|
|
|
res.code = 1006 |
|
|
|
|
|
|
|
res.msg = "邮箱校验失败" |
|
|
|
|
|
|
|
elif act == "ways": |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if ways['sms']: |
|
|
|
|
|
|
|
pass |
|
|
|
|
|
|
|
elif ways['email']: |
|
|
|
|
|
|
|
pass |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
elif ways['code']: |
|
|
|
|
|
|
|
pass |
|
|
|
|
|
|
|
else: |
|
|
|
|
|
|
|
pass |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
else: |
|
|
|
|
|
|
|
res.code = 1007 |
|
|
|
|
|
|
|
res.msg = "信息发送失败" |
|
|
|
|
|
|
|
return Response(res.dict) |
|
|
|