Exemple #1
0
    def get(self, request):
        code = request.GET.get('code')
        if not code:
            return http.HttpResponseForbidden("缺少code")
        oauth = OAuthQQ(client_id=settings.QQ_CLIENT_ID,
                        client_secret=settings.QQ_CLIENT_SECRET,
                        redirect_uri=settings.QQ_REDIRECT_URI)
        try:
            aaaaaccess_token = oauth.get_access_token(code)
            openid = oauth.get_open_id(aaaaaccess_token)
        except Exception as e:
            logger.error(e)
            return http.HttpResponseServerError('OAuth2.0认证失败')
        try:
            oauth_user = OauthQQUser.objects.get(openid=openid)
        except OauthQQUser.DoesNotExist:
            # 没有帮顶qq
            access_token = generate_access_token(openid)
            context = {'access_token': access_token}
            return render(request, 'oauth_callback.html', context)

        else:
            qq_user = oauth_user.user
            login(request, qq_user)
            response = redirect(reverse('contents:index'))
            response.set_cookie('username',
                                qq_user.username,
                                max_age=3600 * 24 * 14)
            return response
Exemple #2
0
    def get(self, request):
        """Oauth2.0认证"""
        #接收Authorization Code

        code = request.GET.get('code')
        if not code:
            return http.HttpResponseForbidden('缺少code')

        #创建工具对象
        oauth = OAuthQQ(client_id=settings.QQ_CLIENT_ID,
                        client_secret=settings.QQ_CLIENT_SECRET,
                        redirect_uri=settings.QQ_REDIRECT_URI)

        try:
            #携带code 向QQ服务器请求access_token
            access_token = oauth.get_access_token(code)

            #携带access_token 向QQ服务器请求openid
            openid = oauth.get_open_id(access_token)

        except Exception as e:
            #如果上面获取的openid出错,验证失败
            logger.error(e)

            #返回结果
            return http.HttpResponseServerError('OAuth2.0认证失败')

        #判断openid是否绑定用户
        try:
            oauth_user = OAuthQQUser.objects.get(openid=openid)

        except OAuthQQUser.DoesNotExist:
            #如果openid没有绑定用户
            #调用封装好的方法
            access_token = generate_access_token(openid)

            # #拿到access_token 字符串,拼接字典
            context = {'access_token': access_token}

            # #返回响应,重新渲染
            return render(request, 'oauth_callback.html', context)
            pass

        else:
            #如果已绑定用户
            qq_user = oauth_user.user

            #实现状态保持
            login(request, qq_user)

            #创建重定向到主页的对象
            response = redirect(reverse('contents:index'))

            #将用户信息写到cookie中,有效期15天
            response.set_cookie('username',
                                qq_user.username,
                                max_age=3600 * 24 * 15)

            #返回响应
            return response
Exemple #3
0
    def get(self, request):
        # 获取code
        code = request.query_params.get("code")
        if code is None:
            return Response(status=status.HTTP_400_BAD_REQUEST)
        # 通过code获取token值
        oauth = OAuthWeibo(client_id=settings.WEIBO_CLIENT_ID,
                           client_secret=settings.WEIBO_CLIENT_SECRET,
                           redirect_uri=settings.WEIBO_REDIRECT_URI,
                           state=next)
        try:
            access_token = oauth.get_access_token(code)
        except Exception as e:
            return Response(status=status.HTTP_400_BAD_REQUEST)

        try:
            weibo_user = OAuthSinaUser.objects.get(access_token=access_token)
        except OAuthSinaUser.DoesNotExist:
            access_token_itsdangerous = generate_access_token(access_token)
            return Response({'access_token': access_token_itsdangerous})
        else:
            token = jwt_login(weibo_user)

            return Response({
                    'token': token,
                    'username': weibo_user.user.username,
                    'user_id': weibo_user.user.id})
Exemple #4
0
    def get(self, request):
        '''
        接收code值, 验证是否有openid, 返回结果
        :param request:
        :return:
        '''
        # 1.接收参数
        code = request.GET.get('code')

        # 2.检验
        if not code:
            return http.HttpResponseForbidden('缺少必传code')

        # 3.生成QQLoginTool对象
        oauth = OAuthQQ(client_id=settings.QQ_CLIENT_ID,
                        client_secret=settings.QQ_CLIENT_SECRET,
                        redirect_uri=settings.QQ_REDIRECT_URI)

        # 4.调用对象的两个方法 ----> 获取 openid
        try:

            access_token = oauth.get_access_token(code)

            openid = oauth.get_open_id(access_token)
        except Exception as e:
            logger.error(e)

            return http.HttpResponseServerError('oauth2.0认证失败')

        # 5.判断openid是否保存到了我们的数据库中
        try:

            oauth_user = OAuthQQUser.objects.get(openid=openid)
        except OAuthQQUser.DoesNotExist:
            # 7.如果没有, 做另一些事
            # 7.1 把openid加密生成access_token
            access_token = generate_access_token(openid)

            # 7.2 返回access_token
            context = {'access_token': access_token}

            return render(request, 'oauth_callback.html', context=context)

        else:
            # 6.如果有, 登录成功, 返回首页
            # 6.1 状态保持:
            login(request, oauth_user.user)

            response = redirect(reverse('contents:index'))

            # 6.2 cookie
            response.set_cookie('username',
                                oauth_user.user.username,
                                max_age=3600 * 24 * 15)

            response = merge_cart_cookie_to_redis(request, response,
                                                  oauth_user.user)

            return response
Exemple #5
0
 def get(self, request):
     """
     实现QQ登陆的第二个接口,用于接收前端发来的code值,拿着code值去QQ服务器换取access_token,
     拿着access_token换取openid,再拿着openid去数据库中查看用户是否是第一次进行QQ登陆
     如用户不是第一次,则直接登陆成功
     如用户是第一次,则把openid加密生成access_token并返回给前端
     :param request: 请求对象
     :return: 登陆成功或access_token
     """
     # 1.接收code参数
     code = request.GET.get('code')
     # 2.校验参数,判断code是否存在
     if not code:
         return http.HttpResponseForbidden('缺少code参数')
     # 3.创建工具对象
     oauth = OAuthQQ(client_id=settings.QQ_CLIENT_ID,
                     client_secret=settings.QQ_CLIENT_SECRET,
                     redirect_uri=settings.QQ_REDIRECT_URI)
     try:
         # 4.携带code向QQ服务器请求access_token
         access_token = oauth.get_access_token(code)
         # 5.携带access_token向eQQ服务器请求openid
         openid = oauth.get_open_id(access_token)
     except Exception as e:
         logger.error(e)
         return http.HttpResponseServerError('oauth2.0认证失败')
     # 6.判断用户账号是否使用QQ登陆过(openid是否在数据库中)
     try:
         oauth_user = OAuthQQUser.objects.get(openid=openid)
     # 6.1 用户账号没使用QQ登陆过(openid不在数据库中)
     except OAuthQQUser.DoesNotExist:
         # 把openid加密成access_token
         access_token = generate_access_token(openid)
         context = {'access_token': access_token}
         # 返回access_token并跳转到绑定页面
         return render(request, 'oauth_callback.html', context)
     # 6.2 用户账号使用QQ登陆过(openid在数据库中)
     else:
         # 根据user外键,获取对应的QQ用户
         qq_user = oauth_user.user
         # 实现状态保持
         login(request, qq_user)
         # # 创建重定向到首页的对象
         # response = redirect(reverse('contents:index'))
         # 重定向到首页或用户要前往的页面
         next = request.GET.get('state')
         if next:
             response = redirect(next)
         else:
             response = redirect(reverse('contents:index'))
         # 将用户名写入cookie,有效期15天
         response.set_cookie('username',
                             qq_user.username,
                             max_age=3600 * 24 * 15)
         # 合并购物车数据
         response = merge_cart_cookie_to_redis(request, response)
         # 返回响应
         return response
    def get(self, request):
        '''oauth2.0认证'''
        # 1.接收code参数(查询字符串)
        code = request.GET.get('code')

        # 2.判断该参数是否存在
        if not code:
            return JsonResponse({'code': 400, 'errmsg': "缺少code参数"})

        # 3.生成QQLoginTool工具类对象
        oauth = OAuthQQ(
            client_id=settings.QQ_CLIENT_ID,
            client_secret=settings.QQ_CLIENT_SECRET,
            redirect_uri=settings.QQ_REDIRECT_URI,
        )

        try:
            # 4.调用对象的方法, 发送请求, 获取access_token
            access_token = oauth.get_access_token(code)

            # 5.把token作为参数,再次发送请求, 获取openid
            openid = oauth.get_open_id(access_token)
        except Exception as e:
            return JsonResponse({'code': 400, 'errmsg': "给qq发送请求失败"})

        # 6.把openid作为条件在OAuthQQUser中检索. 获取对象
        try:
            oauth_qq = OAuthQQUser.objects.get(openid=openid)
        except Exception as e:
            # 11.把openid加密为access_token
            access_token = generate_access_token(openid)

            # 12.把access_token返回
            return JsonResponse({
                'code': 300,
                'errmsg': "ok",
                'access_token': access_token
            })

        else:
            # 7.如果能拿到OAuthQQUser的对象(说明对象存在)
            user = oauth_qq.user

            # 8.状态保持
            login(request, user)

            response = JsonResponse({'code': 0, 'errmsg': 'ok'})

            # 9.设置cookie中的username
            response.set_cookie('username',
                                user.username,
                                max_age=3600 * 24 * 14)

            # 补充内容:购物车的合并
            response = merge_cart_cookie_to_redis(request, response)

            # 10.返回响应
            return response
Exemple #7
0
    def get(self, request):
        """Oauth2.0认证"""

        #接收Authorization Code
        code = request.GET.get('code')

        if not code:
            return HttpResponseForbidden('缺少code')

        # 创建工具对象
        oauth = OAuthQQ(client_id=settings.QQ_CLIENT_ID,
                        client_secret=settings.QQ_CLIENT_SECRET,
                        redirect_uri=settings.QQ_REDIRECT_URL)

        try:
            # 携带code向QQ服务器请求access_token
            access_token = oauth.get_access_token(code)

            # 携带access_token向QQ服务器请求openid
            openid = oauth.get_open_id(access_token)
        except Exception as e:
            # 如果上面获取openid出错,则验证失败
            logger.error(e)

            #返回结果
            return HttpResponseServerError('OAuth2.0认证失败')

        try:
            #查看是否有openid对应的用户
            oauth_user = OAuthQQUser.objects.get(openid=openid)
        except OAuthQQUser.DoesNotExist:
            # 如果openid没绑定美多商城用户
            # 调用我们封装好的方法,对openid进行加密,生成access_token字符串
            access_token = generate_access_token(openid)
            # 拿到access_token字符串后,拼接字典
            context = {'access_token': access_token}
            # 返回响应,重新渲染
            return render(request, 'oauth_callback.html', context)
        else:
            # 如果openid已绑定美多商城用户
            # 根据user外键,获取对应的QQ用户
            qq_user = oauth_user.user
            # 实现状态保持
            login(request, qq_user)

            # 创建重定向到主页的对象
            response = redirect(reverse('contents:index'))

            # 将用户信息写入到cookie中,有效期15天
            response.set_cookie('username', qq_user, max_age=3600 * 24 * 15)

            # 合并购物车
            response = merge_cart_cookie_to_redis(request=request,
                                                  response=response)

            # 返回响应
            return response
    def get(self, request):
        """Oauth2.0认证"""
        # 获取前端发送过来的 code 参数:
        code = request.GET.get('code')

        if not code:
            # 判断 code 参数是否存在
            return http.JsonResponse({'code': 400, 'errmsg': '缺少code参数'})

        # 调用我们安装的 QQLoginTool 工具类
        # 创建工具对象
        oauth = OAuthQQ(
            client_id=settings.QQ_CLIENT_ID,
            client_secret=settings.QQ_CLIENT_SECRET,
            redirect_uri=settings.QQ_REDIRECT_URI,
            # 用户完成整个qq登陆流程之后,返回到美多到哪个页面
            state=next  # http://www.meiduo.site:8080/
        )

        try:
            # 携带 code 向 QQ服务器 请求 access_token
            access_token = oauth.get_access_token(code)

            # 携带 access_token 向 QQ服务器 请求 openid
            openid = oauth.get_open_id(access_token)

        except Exception as e:
            # 如果上面获取 openid 出错, 则验证失败
            logger.error(e)
            # 返回结果
            return http.JsonResponse({
                'code':
                400,
                'errmsg':
                '用户code无效,oauth2.0认证失败, 即获取qq信息失败',
            })

        # 获取openid仅仅代表这用户QQ的身份是没有问题的
        try:
            # 去获取一哈这一个QQ对否已经已经绑定了用户
            qq_uer = OAuthQQUser.objects.get(openid=openid)
        except Exception as e:
            # 用户没有绑定,返回加密后openid--
            # 前端让用户数据用户名和密码,后续接口再去判断绑定
            token = generate_access_token(openid)  # 加密一哈
            return http.JsonResponse({
                'code': 400,
                'errmsg': '未绑定',
                'access_token': token
            })
        else:
            # 如果用户已经绑定了QQ,就说明用户已经注册了美多美多用户
            login(request, qq_uer.user)
            response = http.JsonResponse({'code': 0, 'errmsg': 'ok'})
            response.set_cookie('username', qq_uer.user.username)
            return response
Exemple #9
0
    def get(self, request):
        """oauth2.0认证"""
        # 接收Authorization Code
        code = request.GET.get('code')
        if not code:
            return http.HttpResponseForbidden('缺少code')

        # 创建工具对象
        oauth = OAuthQQ(client_id=settings.QQ_CLIENT_ID,
                        client_secret=settings.QQ_CLIENT_SECRET,
                        redirect_uri=settings.QQ_REDIRECT_URI)

        try:
            # 携带 code 向 QQ服务器 请求 access_token(code)
            access_token = oauth.get_access_token(code)

            # 携带 access_token 向 QQ服务器 请求 openid
            openid = oauth.get_open_id(access_token)

        except Exception as e:
            # 如果上面获取 openid 出错,则验证失败
            logger.error(e)
            # 返回结果
            return http.HttpResponseServerError('OAuth2.0认证失败')
        # 判断 openid 是否绑定过用户
        try:
            oauth_user = OAuthQQUser.objects.get(openid=openid)

        except OAuthQQUser.DoesNotExist:
            # 如果 openid 没绑定美多商城用户, 进入这里
            # 调用我们封装号的方法, 对openid 进行加密, 生成 access_token 字符串
            access_token = generate_access_token(openid)
            # 返回响应, 重新渲染
            context = {
                'access_token': access_token
            }
            return render(request, 'oauth_callback.html', context)

        else:
            # 如果 openid 已绑定美多商城用户
            # 根据 user 外键, 获取对应的 QQ用户
            qq_user = oauth_user.user
            # 实现状态保持
            login(request, qq_user)

            # 创建重定向到主页的对象
            response = redirect(reverse("contents:index"))

            # 将用户信息写入到 cookie 中, 有效期15天
            response.set_cookie('username', qq_user.username, max_age=3600 * 24 * 15)

            # 合并购物车
            response = merge_cart_cookie_to_redis(request, qq_user, response)
            # 返回响应
            return response
Exemple #10
0
    def get(self, request):

        # 获取前端发送过来的 code 参数:
        code = request.GET.get('code')

        if not code:
            # 判断 code 参数是否存在
            return http.JsonResponse({'code': 400,
                                      'errmsg': '缺少code参数'})

        # 调用安装的 QQLoginTool 工具类
        # 创建工具对象
        oauth = OAuthQQ(client_id=settings.QQ_CLIENT_ID,
                        client_secret=settings.QQ_CLIENT_SECRET,
                        redirect_uri=settings.QQ_REDIRECT_URI)

        try:
            # 携带 code 向 QQ服务器 请求 access_token
            access_token = oauth.get_access_token(code)

            # 携带 access_token 向 QQ服务器 请求 openid
            openid = oauth.get_open_id(access_token)
        except Exception as e:
            # 如果上面获取 openid 出错, 则验证失败
            logger.error(e)
            # 返回结果
            return http.JsonResponse({'code': 400,
                                      'errmsg': '获取qq信息失败'})
        try:
            oauth_qq = OAuthQQUser.objects.get(openid=openid)
        except OAuthQQUser.DoesNotExist:
            # 把 openid 变为 access_token
            access_token = generate_access_token(openid)

            # 把 access_token 返回给前端
            return http.JsonResponse({'code': 300,
                                      'errmsg': 'ok',
                                      'access_token': access_token})


        else:
            # 根据 user 外键, 获取对应的 QQ 用户(user)
            user = oauth_qq.user

            # 实现状态保持
            login(request, user)

            # 创建重定向到主页的对象
            response = http.JsonResponse({'code': 0,
                                          'errmsg': 'ok'})

            # 将用户信息写入到 cookie 中,有效期14天
            response.set_cookie('username',
                                user.username,
                                max_age=3600 * 24 * 14)
Exemple #11
0
    def get(self, request):
        """

        :param request:
        :return:
        """

        code = request.GET.get('code')

        if not code:
            return http.HttpResponseForbidden('缺少必传参数')

        # 3.获取QQLoginTool框架对象
        oauth = OAuthQQ(client_id=settings.QQ_CLIENT_ID,
                        client_secret=settings.QQ_CLIENT_SECRET,
                        redirect_uri=settings.QQ_REDIRECT_URI)

        try:
            # 4.调用对象的方法, 发送请求给qq, 获取access_token
            access_token = oauth.get_access_token(code)

            # 5.根据 access_token 再次发送请求, 获取 openid
            openid = oauth.get_open_id(access_token)
        except Exception as e:
            logger.error(e)
            return http.HttpResponseServerError('oath2.0请求出错')

            # 6.去保存openid的表中,获取一下, 查看有没有
        try:
            oauth_qq = OAuthQQUser.objects.get(openid=openid)
        except Exception as e:
            # 8.如果没有: 把openid加密形成: access_token 返回给前端
            access_token = generate_access_token(openid)

            context = {'access_token': access_token}

            return render(request, 'oauth_callback.html', context=context)

        else:
            user = oauth_qq.user

            # 7.如果有:  直接重定向到首页
            # 7.1 保持状态
            login(request, user)

            response = redirect(reverse('contents:index'))

            # 7.2 写入cookie值: username
            response.set_cookie('username',
                                user.username,
                                max_age=3600 * 24 * 14)

            # 7.3 重定向到首页
            return response
Exemple #12
0
    def get(self, request):
        """Oauth2.0认证"""
        # 接收Authorization Code
        code = request.GET.get('code')

        if not code:
            return http.HttpResponseForbidden('缺少code')
            # 创建工具对象
        oauth = OAuthQQ(client_id=settings.QQ_CLIENT_ID,
                        client_secret=settings.QQ_CLIENT_SECRET,
                        redirect_uri=settings.QQ_REDIRECT_URI)
        # 给第三方软件发送请求,需要try一下。
        try:
            # 携带 code 向 QQ服务器 请求 access_token
            access_token = oauth.get_access_token(code)

            # 携带 access_token 向 QQ服务器 请求 openid
            openid = oauth.get_open_id(access_token)

        except Exception as e:
            # 如果上面获取 openid 出错, 则验证失败
            print(e)
            # 返回结果
            return http.HttpResponseServerError('OAuth2.0认证失败')

        # 判断 openid 是否绑定过用户(判断用户是不是第一次qq登陆)
        try:
            oauth_user = OAuthQQUser.objects.get(openid=openid)
        except OAuthQQUser.DoesNotExist:
            # 如果openid没绑定美多商城用户
            # 调用我们封装好的方法,对openid进行加密,生成access_token字符串
            access_token = generate_access_token(openid)
            # 拿到access_code字符串后,拼接字典
            context = {'access_token': access_token}
            # 返回响应,重新渲染
            return render(request, 'oauth_callback.html', context)
        else:
            # 如果openid绑定美多商城用户
            # 根据 user 外键, 获取对应的 QQ用户
            qq_user = oauth_user.user
            # 实现状态保持
            login(request,qq_user)

            # 创建重定向到主页的对象
            response = redirect(reverse('contents:index'))

            # 将用户信息写入到cookie中,有效期15天
            response.set_cookie('username',qq_user.username,max_age=3600)

            # 返回响应
            return response
Exemple #13
0
    def get(self ,request ):

        #提取參數
        code = request.GET.get('code')
        error = request.GET.get('error')
        state = request.GET.get('state')
        #判斷用戶是否授權
        if error:
            return redirect(reverse('users:login'))
        try:
            #請求line接口獲取id_token
            id_token = get_id_token(code)
            #判斷是否成功授權,若授權失敗,立即中止註冊
            if not id_token:
                return redirect(reverse('contents:index'))
            #請求line接口驗證並解碼id_token
            picture ,userid ,user_messages_dict = get_profile_information(id_token ,state )
        except Exception as e:
            logger.error(e)
            return HttpResponseServerError('OAuth2.0認證失敗')
        #判斷用戶是否存在
        try:
            oauth_line_user = OAuthLineUser.objects.get(userid=userid)
        except Exception:
            #用戶未用line登入過
            #簽名用戶數據
            access_token = generate_access_token(user_messages_dict)
            #構造響應數據
            contents = {
                'access_token':access_token ,
                'picture':picture ,
            }
            #返回用戶加密數據和line用戶註冊頁面
            return render(request ,'line_register.html' ,contents )
        else:
            #實現狀態保持:oauth_line_user.user代表從oauth_line_user中找出對應的用戶模型類對象
            login(request ,oauth_line_user.user )
            #重定向到指定頁面:state
            if state == '/':
                response = redirect(reverse('contents:index'))
            else:
                response = redirect(state)
            #將用戶登入資訊寫入到cookies
            response.set_cookie('username' ,oauth_line_user.user.username ,constants.LOGIN_COOKIE_EXPIRES )
            response.set_cookie('photo_url' ,oauth_line_user.photo_url ,constants.LOGIN_COOKIE_EXPIRES )

            #用戶登錄成功後,同樣商品將cookies購物車數據覆蓋寫入redis
            response = merge_carts_cookies_redis(request, oauth_line_user.user, response)
            #返回響應
            return response
    def get(self, request):
        """处理QQ登录回调的业务逻辑"""

        # 获取code
        code = request.GET.get('code')
        if not code:
            return http.HttpResponseForbidden('获取code失败')

        # 创建工具对象
        oauth = OAuthQQ(client_id=settings.QQ_CLIENT_ID,
                        client_secret=settings.QQ_CLIENT_SECRET,
                        redirect_uri=settings.QQ_REDIRECT_URI)

        try:
            # 使用code获取access_token
            access_token = oauth.get_access_token(code)

            # 使用access_token获取openid
            openid = oauth.get_open_id(access_token)
        except Exception as e:
            logger.error(e)
            return http.HttpResponseServerError('OAuth2.0认证失败')

        # 使用openid判断该QQ用户是否绑定过美多商城的用户
        try:
            oauth_user = OAuthQQUser.objects.get(openid=openid)
        except OAuthQQUser.DoesNotExist:
            # openid未绑定美多商城用户
            access_token_openid = generate_access_token(openid)
            context = {'access_token_openid': access_token_openid}
            return render(request, 'oauth_callback.html', context)
        else:
            # openid已绑定美多商城用户:oauth_user.user表示从QQ登陆模型类对象中找到对应的用户模型类对象
            login(request, oauth_user.user)

            # 重定向到state:从哪来,QQ登录完之后回哪而去
            next = request.GET.get('state')
            response = redirect(next)

            # 将用户名写入到cookies中
            response.set_cookie('username',
                                oauth_user.user.username,
                                max_age=3600 * 24 * 15)

            # 用户登录成功,合并cookie购物车到redis购物车
            response = merge_carts_cookies_redis(request=request,
                                                 user=oauth_user.user,
                                                 response=response)
            # 响应QQ登录结果
            return response
Exemple #15
0
    def get(self, request):
        # 接收参数
        code = request.GET.get('code')
        # 检验参数
        if not code:
            return JsonResponse({
                'code': 400,
                'errmsg': '缺少code参数'
            })
        # 处理数据
        # 创建oauth工具类,传入code,转化成access_code,再向qq服务器请求openid
        oauth = OAuthQQ(client_id=settings.QQ_CLIENT_ID,
                        client_secret=settings.QQ_CLIENT_SECRET,
                        redirect_uri=settings.QQ_REDIRECT_URI)

        try:
            # 使用oauth类对象的方法获取access_code
            access_token = oauth.get_access_token(code)
            # 使用oauth类对象的方法请求qq服务器获取openid
            openid = oauth.get_open_id(access_token)
        except Exception as e:
            logger.error(e)
            return JsonResponse({
                'code': 400,
                'errmsg': 'oauth2.0认证失败,获取用户qq认证消息失败'
            })

        try:
            # 如果存在openid,则获取oauth的外键对象,表明用户已经注册并绑定了qq
            # 状态保持
            oauth_qq = OAuthQQUser.objects.get(openid=openid)
            user = oauth_qq.user
            login(request, user)
            response = JsonResponse({
                'code': 0,
                'errmsg': 'ok',
            })
            response.set_cookie('username',
                                user.username,
                                max_age=3600 * 24 * 14)
            return response
        except Exception as e:
            # 加密openid传给用户
            access_token = generate_access_token(openid)

            return JsonResponse({
                'access_token': access_token
            })
Exemple #16
0
    def get(self, request):
        """Oauth2.0认证"""
        # 接收Authorization Code
        code = request.GET.get('code')
        if not code:
            return http.HttpResponseForbidden('缺少必传参数')
        # 创建工具对象
        oauth = OAuthQQ(client_id=settings.QQ_CLIENT_ID,
                        client_secret=settings.QQ_CLIENT_SECRET,
                        redirect_uri=settings.QQ_REDIRECT_URI)
        try:
            # 携带code向qq服务器请求access_token
            access_token = oauth.get_access_token(code)
            # 携带access_token去请求openid
            openid = oauth.get_open_id(access_token)
        except Exception as e:
            logger.error(e)
            return http.HttpResponseForbidden('OAuth2.0认证失败')

        # 使用openID去判断用户是否存在
        try:
            oauth_user = OAuthQQUser.objects.get(openid=openid)
        except OAuthQQUser.DoesNotExist:
            # 用户不存在
            access_token = generate_access_token(openid)
            # 拿到access_token,渲染到模板中返回
            context = {'access_token': access_token}
            return render(request, 'oauth_callback.html', context)
            pass
        else:
            # 用户存在
            # 根据外键,获取对应的QQ用户
            user = oauth_user.user

            # 实现状态保持
            login(request, user)

            # 创建重定向到首页
            response = redirect(reverse('contents:index'))

            # 写入cookie,15天
            response.set_cookie('username',
                                user.username,
                                max_age=3600 * 24 * 15)

            # 返回响应
            return response
Exemple #17
0
    def get(self, request):
        """Oauth2.0认证"""
        # 提取code请求参数
        code = request.GET.get('code')
        if not code:
            return http.HttpResponseForbidden('缺少code')
        # 创建工具对象
        oauth = OAuthQQ(client_id=settings.QQ_CLIENT_ID, client_secret=settings.QQ_CLIENT_SECRET, redirect_uri=settings.QQ_REDIRECT_URI)
        try:
            # 使用code向QQ服务器请求access_token
            access_token = oauth.get_access_token(code)
        except Exception:
            logger.error('向QQ服务器请求access_token失败')
            return http.HttpResponseServerError('OAuth2.0认证失败')
        try:
            # 使用access_token向QQ服务器请求openid
            openid = oauth.get_open_id(access_token)
        except Exception:
            logger.error('向QQ服务器请求openid失败')
            return http.HttpResponseServerError('OAuth2.0认证失败')
        try:
            oauth_user = OAuthQQUser.objects.get(openid=openid)
        except OAuthQQUser.DoesNotExist:
            # 如果openid没绑定美多商城用户
            access_token_openid = generate_access_token(openid)
            context = {'access_token_openid': access_token_openid}
            return render(request, 'oauth_callback.html', context)
        else:
            # 如果openid已绑定美多商城用户
            # 实现状态保持
            qq_user = oauth_user.user
            login(request, qq_user)

            # 响应结果
            next = request.GET.get('state')
            response = redirect(next)

            # 登录时用户名写入到cookie,有效期15天
            response.set_cookie('username', qq_user.username, max_age=3600 * 24 * 15)
            # 若用户登录成功,合并cookie中的购物车
            merge_carts_cookies_redis(request=request, user=qq_user, response=response)
            return response
Exemple #18
0
    def get(self, request):
        # 接收参数
        code = request.GET.get('code')

        if not code:
            return JsonResponse({'code': 400, 'errmsg': '缺少code参数'})

        oauth = OAuthQQ(client_id=settings.QQ_CLIENT_ID,
                        client_secret=settings.QQ_CLIENT_SECRET,
                        redirect_uri=settings.QQ_REDIRECT_URI)

        try:
            # 获取access token
            access_token = oauth.get_access_token(code)

            # 获取openid
            openid = oauth.get_open_id(access_token)
        except Exception as e:
            print(e)
            logger.error(e)
            return JsonResponse({'code': 400, 'errmsg': '认证失败'})

        try:
            oauth_qq = OAuthQQUser.objects.get(openid=openid)
        except Exception as e:
            # openid 没有绑定商城用户
            access_token = generate_access_token(openid)
            return JsonResponse({
                'code': 300,
                'errmsg': 'ok',
                'access_token': access_token
            })

        user = oauth_qq.user
        login(request, user)
        response = JsonResponse({'code': 0, 'errmsg': 'ok'})
        response.set_cookie('username', user.username, max_age=3600 * 24 * 14)

        # 合并购物车
        response = merge_cart_cookie_to_redis(request, user, response)
        return response
Exemple #19
0
    def get(self, request):
        code = request.GET.get('code')
        if not code:
            return http.HttpResponseForbidden('获取code失败')
        oauth = OAuthQQ(client_id=settings.QQ_CLIENT_ID,
                        client_secret=settings.QQ_CLIENT_SECRET,
                        redirect_uri=settings.QQ_REDIRECT_URI)
        try:
            # 使用code获取access_token
            access_token = oauth.get_access_token(code)
            # 使用access_token获取openid
            openid = oauth.get_open_id(access_token)
        except Exception as e:
            logger.error(e)
            return http.HttpResponseServerError('OAuth2.0认证失败')

        # 使用openid判断该QQ用户是否绑定过美多商城的用户
        try:
            oauth_user = OAuthQQUser.objects.get(openid=openid)
        except OAuthQQUser.DoesNotExist:
            # openid未绑定用户
            access_token_openid = generate_access_token(openid)
            context = {'access_token_openid': access_token_openid}
            return render(request, 'oauth_callback.html', context)
        else:
            # openid已绑定用户
            login(request, oauth_user.user)
            # 重定向到state
            next = request.GET.get('state')
            response = redirect(next)
            # 为了实现首页右上角展示用户名信息
            response.set_cookie('username',
                                oauth_user.user.username,
                                max_age=3600 * 24 * 15)

            # 用户登录成功,合并cookie购物车到Redis购物车
            response = merge_cart_cookies_redis(request=request,
                                                user=oauth_user.user,
                                                response=response)
            return response
Exemple #20
0
 def get(self, request):
     code = request.GET.get('code')
     if not code:
         return http.HttpResponseForbidden('缺少code')
     oauth = OAuthQQ(client_id=settings.QQ_CLIENT_ID,
                     client_secret=settings.QQ_CLIENT_SECRET,
                     redirect_uri=settings.QQ_REDIRECT_URI)  # state只需要携带一次
     try:
         access_token = oauth.get_access_token(code)
         openid = oauth.get_open_id(access_token)
     except Exception as e:
         logger.error(e)
         return http.HttpResponseServerError('OAuth2.0认证失败')
     try:
         # 查询是否绑定
         oauth_qq_user = OAuthQQUser.objects.get(openid=openid)
     except OAuthQQUser.DoesNotExist:
         # 如果openid没绑定美多商城用户
         # 加密的openid
         access_token_openid = generate_access_token(openid)
         context = {'access_token_openid': access_token_openid}
         # oauth_callback.html绑定用户的界面
         return render(request, 'oauth_callback.html', context)
     else:
         # 如果openid已绑定美多商城用户
         login(request, oauth_qq_user.user)
         # 哪里点击的qq登录回哪里
         next_url = request.GET.get('state')
         response = redirect(next_url)
         response.set_cookie('username',
                             oauth_qq_user.user.username,
                             max_age=3600 * 24 * 15)
         response = merge_cart_cookie_to_redis(request=request,
                                               user=oauth_qq_user.user,
                                               response=response)
         return response
Exemple #21
0
    def get(self, request):
        code = request.GET.get('code')
        if not code:
            # 判断 code 参数是否存在
            return JsonResponse({'code': 400, 'errmsg': '缺少code参数'})

        oauth = OAuthQQ(client_id=settings.QQ_CLIENT_ID,
                        client_secret=settings.QQ_CLIENT_SECRET,
                        redirect_uri=settings.QQ_REDIRECT_URI,
                        state=next)
        try:
            # 携带 code 向 QQ服务器 请求 access_token
            access_token = oauth.get_access_token(code)

            # 携带 access_token 向 QQ服务器 请求 openid
            openid = oauth.get_open_id(access_token)

        except Exception as e:
            # 如果上面获取 openid 出错, 则验证失败
            logger.error(e)
            # 返回结果
            return JsonResponse({
                'code': 400,
                'errmsg': 'oauth2.0认证失败, 即获取qq信息失败'
            })
        # 判断用户是否绑定过qq
        try:
            open_result = OAuthQQUser.objects.get(openid=openid)
        except OAuthQQUser.DoesNotExist:
            # 如果 openid 没绑定美多商城用户,进入这里:

            # 调用我们自定义的方法, 对 openid 进行加密
            # 把 openid 变为 access_token
            access_token = generate_access_token(openid)

            # 把 access_token 返回给前端
            # 注意: 这里一定不能返回 0 的状态码. 否则不能进行绑定页面
            return JsonResponse({
                'code': 300,
                'errmsg': 'ok',
                'access_token': access_token
            })

        else:
            # 绑定的操作
            user = open_result.user

            # 实现状态保持
            login(request, user)

            # 创建重定向到主页的对象
            response = JsonResponse({'code': 0, 'errmsg': 'ok'})

            # 将用户信息写入到 cookie 中,有效期14天
            response.set_cookie('username',
                                user.username,
                                max_age=3600 * 24 * 14)
            response = merge_cart_cookie_to_redis(request=request,
                                                  user=user,
                                                  response=response)
            return response