登录
- 借助JWT提供的登录视图
# 重写jwt_response_payload_handler方法, 自定义返回数据
response_data = jwt_response_payload_handler(token, user, request)
# 在utils中重写该方法
def jwt_response_payload_handler(token, user=None, request=None):
"""
自定义jwt认证成功返回数据
"""
return {
'token': token,
'user_id': user.id,
'username': user.username
}
# 修改配置文件
JWT_AUTH = {
'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),
'JWT_RESPONSE_PAYLOAD_HANDLER': 'users.utils.jwt_response_payload_handler',
}
- 增加支持用户名和手机号均可作为登录账号
# 对authenticate进行重写, 让其可以根据username内容的不同, 用不同方式取出user对象
if all(credentials.values()):
user = authenticate(**credentials)
# 在utils中重写
def get_user_by_account(account):
"""
根据帐号获取user对象
:param account: 账号,可以是用户名,也可以是手机号
:return: User对象 或者 None
"""
try:
if re.match('^1[3-9]\d{9}$', account):
# 帐号为手机号
user = User.objects.get(mobile=account)
else:
# 帐号为用户名
user = User.objects.get(username=account)
except User.DoesNotExist:
return None
else:
return user
class UsernameMobileAuthBackend(ModelBackend):
"""
自定义用户名或手机号认证
"""
def authenticate(self, request, username=None, password=None, **kwargs):
user = get_user_by_account(username)
if user is not None and user.check_password(password):
return user
# 配置文件中告知自定义的认证后端
AUTHENTICATION_BACKENDS = [
'users.utils.UsernameMobileAuthBackend',
]
- 第三方登录, QQ登录
class QQAuthURLView(APIView):
def get(self, request):
next = request.query_params.get('state')
if not next:
next = '/'
#
oauth = OAuthQQ(client_id=dev.QQ_CLIENT_ID,client_secret=dev.QQ_CLIENT_SECRET,redirect_uri=dev.QQ_REDIRECT_URI,state=next)
login_url = oauth.get_qq_url()
return Response({'login_url':login_url})