def get(self, request): code = request.query_params.get('code') if not code: return Response({'message': '缺少code'}, status=status.HTTP_400_BAD_REQUEST) oauth_qq = OAuthQQ() try: access_token = oauth_qq.get_access_token(code) openid = oauth_qq.get_openid(access_token) except OAuthQQAPIError: return Response({'message': '访问QQ接口异常'}, status=status.HTTP_503_SERVICE_UNAVAILABLE) try: oauth_qq_user = OAuthQQUser.objects.get(openid=openid) except OAuthQQUser.DoesNotExist: # 如果数据不存在,处理openid 并返回 access_token = oauth_qq.generate_bind_user_access_token(openid) return Response({'access_token': access_token}) else: jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER user = oauth_qq_user.user payload = jwt_payload_handler(user) token = jwt_encode_handler(payload) return Response({ 'username': user.username, 'user_id': user.id, 'token': token })
def get(self, request): """ 接收:code,是qq返回的授权凭证code 返回:access_token:用户第一次使用QQ登录时需要返回,包含openid,用于跳转到绑定身份界面 通过itsdangerous生成access_token token:用户不是第一次使用QQ登录时需要返回,通过JWTtoken username & user_id:用户不是第一次使用QQ登录时返回 """ # 取参 code = request.query_params.get("code") # 校参 if not code: return Response({"message": "缺少code"}, status=status.HTTP_400_BAD_REQUEST) # 实例化QQ认证辅助工具类: oauth_qq = OAuthQQ() try: # 通过code获取access_token access_token = oauth_qq.get_access_token(code) # 通过access_token获取openid openid = oauth_qq.get_openid(access_token) except OAuthQQAPIError: return Response({"message": "访问QQ接口获取access_token/openid异常"}, status=status.HTTP_503_SERVICE_UNAVAILABLE) # 此时已经获取了openid;接下来从数据库读取qq用户openid数据 try: oauth_qq_user = OAuthQQUser.objects.get(openid=openid) except OAuthQQUser.DoesNotExist: # 如果qq用户数据不存在,则通过openid生成假的access_token并返回 # 方法内部使用isdangerous access_token = oauth_qq.generate_bind_user_access_token(openid) return Response({"access_token": access_token}) else: # 尝试查询成功,表明用户已经绑定过身份,则签发jwt token jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER # 通过三方表的外键获取当前用户对象 user = oauth_qq_user.user payload = jwt_payload_handler(user) token = jwt_encode_handler(payload) # 响应数据:登录注册都一样: # 以下数据将在Response中放在第一个参数data中,前端通过request.data获取数据 # return Response({ # "username": user.username, # "user_id": user.id, # "token": token # }) # 已绑定用户:返回response前,调用合并购物车数据的公共方法,并接受返回值作为response response = Response({ "username": user.username, "user_id": user.id, "token": token }) response = merge_cart_cookie_to_redis(request, user, response) return response
def get(self, request): # 获取code code = request.query_params.get('code') if not code: return Response({'message': '缺少code'}, status=status.HTTP_400_BAD_REQUEST) # 通过工具获取access_token oauth_qq = OAuthQQ() try: # 凭借code 获取access_token access_token = oauth_qq.get_access_token(code) # 凭借access_token获取 openid openid = oauth_qq.get_openid(access_token) except OAuthQQAPIError: return Response({'message': '访问QQ接口异常'}, status=status.HTTP_503_SERVICE_UNAVAILABLE) # 根据openid查询数据库OAuthQQUser 判断数据是否存在 try: oauth_qq_user = OAuthQQUser.objects.get(openid=openid) except OAuthQQUser.DoesNotExist: # 如果数据不存在,处理openid 要求用户绑定并注册 , 返回 access_token = OAuthQQ.generate_bind_user_access_token(openid) return Response({'access_token': access_token}) else: # 如果数据存在,表示用户已经绑定过身份, 签发JWT token jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER # 签发的时候,要向 jwt_payload_handler 传递 user对象 user = oauth_qq_user.user payload = jwt_payload_handler(user) token = jwt_encode_handler(payload) # return Response({ # 'token': token, # 'username': user.username, # 'user_id': user.id # }) response = Response({ 'token': token, 'username': user.username, 'user_id': user.id }) # 合并购物车 merge_cart_cookie_to_redis(request, user, response) return response
def get(self, request): """ GET /oauth/qq/user/?code=xxx :param request: :return: 1. 如果用户是第一次使用QQ登录,返回access_token(包含openid) 2. 如果用户不是第一次使用QQ登录,返回JWT token, username, user_id """ code = request.query_params.get("code") if not code: return Response({"message": "缺少code"}, status=status.HTTP_400_BAD_REQUEST) oauth_qq = OAuthQQ() try: # 通过授权的code获取access_token(开发者身份标识) access_token = oauth_qq.get_access_token(code) # 通过access_token获取openid(用户唯一身份标识) openid = oauth_qq.get_openid(access_token) except OAuthQQAPIError: return Response({'message': '访问QQ接口异常'}, status=status.HTTP_503_SERVICE_UNAVAILABLE) # 根据openid查询数据库OAuthQQUser,判断用户是否存在 try: oauth_qq_user = OAuthQQUser.objects.get(openid=openid) except OAuthQQUser.DoesNotExist: # 用户不存在,说明之前没有注册过,把openid加密成JWT然后直接返回,要求用户填写资料注册账号 access_token = oauth_qq.generate_bind_user_access_token(openid) return Response({"access_token": access_token}) else: # 用户存在,表示QQ已经绑定过本网站账号,直接签发JWT返回 jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER user = oauth_qq_user.user # 用户模型对象取出user字段信息 payload = jwt_payload_handler(user) # 放入载荷中 token = jwt_encode_handler(payload) # 生成JWT Token response = Response({ "username": user.username, "user_id": user.id, "token": token }) # 合并购物车 response = merge_cart_cookie_to_redis(request, user, response) return response
def get(self, request): # 获取code code = request.query_params.get("code") if not code: return Response({"message":"缺少code"}, status=status.HTTP_400_BAD_REQUEST) oauth_qq = OAuthQQ() try: # 通过code获取access_token access_token = oauth_qq.get_access_token(code) # 通过access_token获取openid openid = oauth_qq.get_openid(access_token) except OAuthQQAPIError: return Response({"message":"访问QQ借口异常"}, status=status.HTTP_503_SERVICE_UNAVAILABLE) # 根据openid查询OAuthQQUser 是否有数据 try: oauth_qq_use = OAuthQQUser.objects.get(openid=openid) except: # 如果数据不存在,处理openid并返回 access_token = oauth_qq.generate_bind_user_access_token(openid) return Response({"access_token": access_token}) else: # 数据存在,说明用户已经绑定身份, 签发JWT token jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER user = oauth_qq_use.user payload = jwt_payload_handler(user) token = jwt_encode_handler(payload) # return Response({ # 'username': user.username, # 'user_id': user.id, # 'token': token # }) response = Response({ 'username': user.username, 'user_id': user.id, 'token': token }) # 添加合并购物车 response = merge_cart_cookie_to_redis(request, user, response) return response
def get(self, request): """ 获取qq登录的用户数据 """ # 获取code code = request.query_params.get('code') if not code: return Response({'message': '缺少code'}, status=status.HTTP_400_BAD_REQUEST) oauth = OAuthQQ() try: # 凭借code 获取access_token access_token = oauth.get_access_token(code) # 凭借access_token 获取token_id openid = oauth.get_openid(access_token) except OAuthQQAPIError: return Response({'message': '访问QQ接口异常'}, status=status.HTTP_503_SERVICE_UNAVAILABLE) # 根据openid查询数据库OAuthQQUser 判断数据是否存在 try: oauth_qq_user = OAuthQQUser.objects.get(openid=openid) except OAuthQQUser.DoesNotExist: # 数据不存在, 处理openid并返回 access_token = oauth.generate_bind_user_access_token(openid) return Response({'access_token': access_token}) else: # 数据存在, 表示用户已经绑定过身份, 签发JWT token jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER user = oauth_qq_user.user payload = jwt_payload_handler(user) token = jwt_encode_handler(payload) return Response({ 'username': user.username, 'user_id': user.id, 'token': token, })