def get(self, request): """ 获取QQ登录用户的openid并处理: 1. 获取code并校验(code必传) 2. 获取QQ登录用户openid 2.1 根据code请求qq服务器获取access_token 2.2 根据access_token请求qq服务器获取openid 3. 根据openid判断是否绑定过本网站用户 3.1 如果已绑定,直接生成jwt token并返回 3.2 如果未绑定,将openid加密并返回 """ # 1. 获取code并校验(code必传) code = request.query_params.get('code') if code is None: return Response({'message': '缺少code参数'}, status=status.HTTP_400_BAD_REQUEST) # 2. 获取QQ登录用户openid oauth = OAuthQQ() try: # 2.1 根据code请求qq服务器获取access_token access_token = oauth.get_access_token(code) # 2.2 根据access_token请求qq服务器获取openid openid = oauth.get_openid(access_token) except QQAPIError: return Response({'message': 'QQ登录异常'}, status=status.HTTP_503_SERVICE_UNAVAILABLE) # 3. 根据openid判断是否绑定过本网站用户 try: qq_user = OAuthQQUser.objects.get(openid=openid) except OAuthQQUser.DoesNotExist: # 3.2 如果未绑定,将openid加密并返回 secret_openid = oauth.generate_save_user_token(openid) return Response({'access_token': secret_openid}) else: # 3.1 如果已绑定,直接生成jwt token并返回 from rest_framework_jwt.settings import api_settings user = qq_user.user # 生成载荷的内容 jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER # 生成jwt token jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER payload = jwt_payload_handler(user) token = jwt_encode_handler(payload) # 返回响应 response_data = { 'user_id': user.id, 'username': user.username, 'token': token } # 调用合并购物车记录函数 response = Response(response_data) merge_cookie_cart_to_redis(request, user, response) return response
def post(self, request, *args, **kwargs): # 调用父类的post response = super().post(request, *args, **kwargs) # 补充购物车记录合并:调用合并购物车记录函数 user = self.user merge_cookie_cart_to_redis(request, user, response) return response
def post(self, request, *args, **kwargs): # 调用父类的post方法 response = super().post(request) # 获取绑定用户 user = self.user # 调用合并购物车记录的函数 merge_cookie_cart_to_redis(request, user, response) return response
def post(self, request, *args, **kwargs): """ 保存绑定QQ登录用户的数据 """ # 调用父类的post进行QQ登录用户的绑定 response = super().post(request, *args, **kwargs) # 获取用户user user = self.user # 调用合并购物车记录函数 merge_cookie_cart_to_redis(request, user, response) return response
def post(self, request): """ 保存绑定的数据: 1. 获取参数并进行校验(参数的完整性,手机号格式,短信验证码是否正确,access_token是否有效,如果手机已注册,校验密码是否正确) 2. 保存QQ登录绑定的数据 3. 返回应答,登录成功 """ # 1. 获取参数并进行校验(参数的完整性,手机号格式,短信验证码是否正确,access_token是否有效,如果手机已注册,校验密码是否正确) serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) # 2. 保存QQ登录绑定的数据(create) user = serializer.save() # 3. 返回应答,登录成功 # 调用合并购物车记录函数 response = Response(serializer.data, status=status.HTTP_201_CREATED) merge_cookie_cart_to_redis(request, user, response) return response
def post(self, request, *args, **kwargs): serializer = self.get_serializer(data=request.data) if serializer.is_valid(): user = serializer.object.get('user') or request.user token = serializer.object.get('token') response_data = jwt_response_payload_handler(token, user, request) response = Response(response_data) if api_settings.JWT_AUTH_COOKIE: expiration = (datetime.utcnow() + api_settings.JWT_EXPIRATION_DELTA) response.set_cookie(api_settings.JWT_AUTH_COOKIE, token, expires=expiration, httponly=True) # 调用合并购物车记录的函数 merge_cookie_cart_to_redis(request, user, response) return response return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def post(self, request): """ 保存QQ登录绑定数据 1.获取参数并进行校验(参数完整性,手机号格式,短信验证码是否正确,access_token是否有效) 2.保存QQ绑定的数据 3.返回应答,绑定成功 """ # 1.获取参数并进行校验(参数完整性,手机号格式,短信验证码是否正确,access_token是否有效) serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) # 2.保存QQ绑定的数据 serializer.save() # 3.返回应答,绑定成功 response = Response(serializer.data, status=status.HTTP_201_CREATED) # 调用合并购物车记录函数 user = self.user merge_cookie_cart_to_redis(request, user, response) return response
def post(self, request): """ 保存QQ登录绑定数据: 1. 获取参数并进行校验(参数完整性,手机号格式,短信验证码是否正确,access_token是否有效) 2. 保存QQ绑定的数据并生成jwt token 3. 返回应答,绑定成功 """ # 1. 获取参数并进行校验(参数完整性,手机号格式,短信验证码是否正确,access_token是否有效) serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) # 2. 保存QQ绑定的数据(create) serializer.save() # 3. 返回应答,绑定成功 response = Response(serializer.data, status=status.HTTP_201_CREATED) # 调用合并购物车记录函数 user = self.user merge_cookie_cart_to_redis(request, user, response) return response
def get(self, request): """ 获取QQ登录用户的openid并进行处理: 1. 获取code并进行校验(code必须传递) 2. 获取QQ登录用户的openid 2.1 根据code请求QQ服务器获取access_token 2.2 根据access_token请求QQ服务器获取QQ登录用户的openid 3. 根据openid进行处理 3.1 如果openid已经绑定过本网站的用户,直接签发 jwt token,返回 3.2 如果openid没有绑定过本网站的用户,对openid进行加密生成token,返回 """ # 1. 获取code并进行校验(code必须传递) code = request.query_params.get('code') if not code: return Response({'message': '缺少code'}, status=status.HTTP_400_BAD_REQUEST) # 2. 获取QQ登录用户的openid oauth = OAuthQQ() try: # 2.1 根据code请求QQ服务器获取access_token access_token = oauth.get_access_token(code) # 2.2 根据access_token请求QQ服务器获取QQ登录用户的openid openid = oauth.get_openid(access_token) except QQAPIError as e: logger.error(e) return Response({'message': 'QQ服务异常'}, status=status.HTTP_503_SERVICE_UNAVAILABLE) # 3. 根据openid进行处理 try: qq_user = OAuthQQUser.objects.get(openid=openid) except OAuthQQUser.DoesNotExist: # 3.2 如果openid没有绑定过本网站的用户,对openid进行加密生成token,返回 token = OAuthQQ.generate_save_user_token(openid) return Response({'access_token': token}) else: # 3.1 如果openid已经绑定过本网站的用户,直接签发 jwt token,返回 user = qq_user.user # 由服务器签发一个jwt token,保存用户身份信息 from rest_framework_jwt.settings import api_settings jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER # 生成载荷信息(payload) payload = jwt_payload_handler(user) # 生成jwt token token = jwt_encode_handler(payload) # 返回 resp = { 'user_id': user.id, 'username': user.username, 'token': token } # 补充购物车记录合并:调用合并购物车记录函数 response = Response(resp) merge_cookie_cart_to_redis(request, user, response) return response
def get(self, request): """ 获取QQ登录用户openid并处理: 1. 获取code并校验(code必传) 2. 获取QQ登录用户的openid 2.1 根据code请求QQ服务器获取access_token 2.2 根据access_token请求QQ服务器获取openid 3. 根据openid进行处理 3.1 如果openid已绑定本网站用户,直接生成jwt token数据并返回 3.2 如果openid未绑定本网站用户,将openid进行加密并返回 """ # 1. 获取code并校验(code必传) code = request.query_params.get('code') if code is None: return Response({'message': '缺少code参数'}, status=status.HTTP_400_BAD_REQUEST) try: # 2. 获取QQ登录用户的openid oauth = OAuthQQ # 2.1 根据code请求QQ服务器获取access_token access_token = oauth.get_access_token(code) # 2.2 根据access_token请求QQ服务器获取openid openid = oauth.get_openid(access_token) except QQAPIError: return Response({'message': 'QQ登录异常'}, status=status.HTTP_503_SERVICE_UNAVAILABLE) # 3. 根据openid进行处理 try: qq_user = OAuthQQUser.objects.get(openid=openid) except OAuthQQUser.DoesNotExist: # 3.2 如果openid未绑定本网站用户,将openid进行加密并返回 token = OAuthQQ.generate_save_user_token(openid) return Response({'access_token': token}) else: # 3.1 如果openid已绑定本网站用户,直接生成jwt token数据并返回 # 由服务器生成一个jwt token,保存当前用户的身份信息 user = qq_user.user from rest_framework_jwt.settings import api_settings # 组织payload数据的方法 jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER # 生成jwt token数据的方法 jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER # 组织payload数据 payload = jwt_payload_handler(user) # 生成jwt token token = jwt_encode_handler(payload) # 增加token属性 user.token = token # 返回响应 res_data = { 'user_id': user.id, 'username': user.username, 'token': token, } response = Response(res_data) # 调用合并购物车记录函数 merge_cookie_cart_to_redis(request, user, response) return response
def get(self, request): """ # 获取QQ登录用户openid并处理 1.获取code并校验(code) 2.获取QQ登录用户的openid 2.1通过code请求QQ服务器获取access_token 2.2通过access_token请求QQ服务器获取openid 3.根据openid判断是否绑定过本网站的用户 3.1 如果已绑定,直接生成jwt token并返回 3.2 如果未绑定,将openid加密并返回 """ # 1.获取code并校验(code) code = request.query_params.get('code') # 判断是否有code if code is None: return Response({'message': '未携带code'}, status=status.HTTP_400_BAD_REQUEST) # 2.获取QQ登录用户的openid oauth = OAuthQQ() try: # 2.1 通过code请求QQ服务器获取access_token access_token = oauth.get_access_token(code) # 2.2 通过access_token请求QQ服务器获取openid openid = oauth.get_openid(access_token) except QQAPIError: return Response({'message': 'QQ登录异常'}, status=status.HTTP_503_SERVICE_UNAVAILABLE) # 3.根据openid判断是否绑定过本网站的用户 try: qq_user = OAuthQQUser.objects.get(openid=openid) except OAuthQQUser.DoesNotExist: # 3.2 如果未绑定,将openid加密并返回 secret_openid = OAuthQQ.generate_save_user_token(openid) return Response({'access_token': secret_openid}) else: # 3.1 如果已绑定,直接生成jwt token并返回 user = qq_user.user # 由服务器生成一个jwt token,保存用户身份信息 from rest_framework_jwt.settings import api_settings # 生成payload的方法 jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER # 生成jwt token的方法 jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER # 生成payload payload = jwt_payload_handler(user) # 生成jwt token token = jwt_encode_handler(payload) # 返回应答 res_data = { 'user_id': user.id, 'username': user.username, 'token': token } response = Response(res_data) # 调用合并购物车记录函数 merge_cookie_cart_to_redis(request, user, response) return response
def get(self, request): """ 获取QQ登录用户的openid并进行处理: 1. 获取code并进行校验(code必传) 2. 获取QQ登录用户的openid 2.1 根据code请求QQ服务器获取access_token 2.2 根据access_token请求QQ服务器获取openid 3. 根据openid进行处理 3.1 如果openid已经绑定过本网站用户,直接签发jwt token并返回 3.2 如果openid未绑定过本网站用户,对openid进行加密,返回加密之后的内容 """ # 1. 获取code并进行校验(code必传) code = request.query_params.get('code') # None if code is None: return Response({'message': '缺少code参数'}, status=status.HTTP_400_BAD_REQUEST) # 2. 获取QQ登录用户的openid oauth = OAuthQQ() try: # 2.1 根据code请求QQ服务器获取access_token access_token = oauth.get_access_token(code) # 2.2 根据access_token请求QQ服务器获取openid openid = oauth.get_openid(access_token) except QQAPIError: return Response({'message': 'QQ登录服务异常'}, status=status.HTTP_503_SERVICE_UNAVAILABLE) # 3. 根据openid进行处理 try: qq_user = OAuthQQUser.objects.get(openid=openid) except OAuthQQUser.DoesNotExist: # 3.2 如果openid未绑定过本网站用户,对openid进行加密,返回加密之后的内容 access_token = OAuthQQ.generate_save_user_token(openid) return Response({'access_token': access_token}) else: # 3.1 如果openid已经绑定过本网站用户,直接签发jwt token并返回 user = qq_user.user # 由服务器生成一个jwt token数据,包含登录用户身份信息 from rest_framework_jwt.settings import api_settings jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER # 生成载荷 payload = jwt_payload_handler(user) # 生成jwt token token = jwt_encode_handler(payload) # 返回响应 resp_data = { 'user_id': user.id, 'username': user.username, 'token': token } response = Response(resp_data) # 调用购物车记录合并函数 merge_cookie_cart_to_redis(request, user, response) return response