Exemplo n.º 1
0
    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
            })
Exemplo n.º 2
0
    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
Exemplo n.º 3
0
    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
Exemplo n.º 4
0
    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
Exemplo n.º 5
0
    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
Exemplo n.º 6
0
    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,
            })