Django 1.7 google oauth2 令牌验证失败

2023-12-24

我正在尝试完成验证 Google 令牌的过程,以便在 Django 应用程序中访问用户的日历。尽管我遵循了网上找到的一些指示,但我的回调函数仍然收到 400 错误代码响应(错误请求)。

views.py

# -*- coding: utf-8 -*-
import os

import argparse
import httplib2
import logging

from apiclient.discovery import build
from oauth2client import tools
from oauth2client.django_orm import Storage
from oauth2client import xsrfutil
from oauth2client.client import flow_from_clientsecrets

from django.http import HttpResponse
from django.http import HttpResponseBadRequest
from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response
from django.core.urlresolvers import reverse
from django.contrib import auth
from django.contrib.auth.decorators import login_required
from django.conf import settings

from apps.tecnico.models import Credentials, Flow

CLIENT_SECRETS = os.path.join(
    os.path.dirname(__file__), '../../client_secrets.json')

@login_required
def index(request):
    storage = Storage(Credentials, 'id', request.user, 'credential')
    FLOW = flow_from_clientsecrets(
        CLIENT_SECRETS,
        scope='https://www.googleapis.com/auth/calendar.readonly',
        redirect_uri='http://MY_URL:8000/oauth2/oauth2callback'
    )
    credential = storage.get()
    if credential is None or credential.invalid is True:
        FLOW.params['state'] = xsrfutil.generate_token(
            settings.SECRET_KEY, request.user)
        authorize_url = FLOW.step1_get_authorize_url()
        f = Flow(id=request.user, flow=FLOW)
        f.save()
        return HttpResponseRedirect(authorize_url)
    else:
        http = httplib2.Http()
        http = credential.authorize(http)
        service = build(serviceName='calendar', version='v3', http=http,
                        developerKey='MY_DEV_KEY_FROM_GOOGLE_CONSOLE')

        events = service.events().list(calendarId='primary').execute()
        return render_to_response('calendario/welcome.html', {
            'events': events['items'],
        })


@login_required
def auth_return(request):
    if not xsrfutil.validate_token(
            settings.SECRET_KEY, request.REQUEST['state'], request.user):
        return HttpResponseBadRequest()

    storage = Storage(Credentials, 'id', request.user, 'credential')
    FLOW = Flow.objects.get(id=request.user).flow
    credential = FLOW.step2_exchange(request.REQUEST)
    storage.put(credential)
    return HttpResponseRedirect("http://MY_URL:8000/caly")

模型.py

from oauth2client.django_orm import FlowField, CredentialsField

[...]

class Credentials(models.Model):
    id = models.ForeignKey(User, primary_key=True)
    credential = CredentialsField()


class Flow(models.Model):
    id = models.ForeignKey(User, primary_key=True)
    flow = FlowField()

我已经下载了client_secrets.json直接从 Google Dev Console 获取文件。 开发控制台中指定的客户端ID类型是“Web应用程序”,我认为这是正确的。 我注意到的是,如果删除令牌验证代码块:

if not xsrfutil.validate_token(
        settings.SECRET_KEY, request.REQUEST['state'], request.user):
    return HttpResponseBadRequest()

一切正常,流程和凭证正确存储在数据库中,并且我可以读取日历。我可能做错了什么?

EDIT:我还检查了传出(至 Google)和传入(至回调)数据:

OUTGOING:

request.user:
admin
settings.SECRET_KEY:
I_AM_NOT_WRITING_IT_HERE
FLOW.params['state']:
SOME_OTHER_RANDOM_STUFF

INCOMING:

request.user:
admin
settings.SECRET_KEY:
I_AM_NOT_WRITING_IT_HERE
FLOW.params['state']:
SOME_OTHER_RANDOM_STUFF

数据是相同的,至少是相同的print来安慰。此外,通过控制台的生成/验证操作正常工作(xsrfutil.validate_token 返回 True,无论是测试数据还是真实数据,包括用户模型实例)。我更纳闷了。


我已经为同样的问题苦苦挣扎了几个小时,并且我找到了 @Ryan Spaulding 和 @Hans Z 回答的解决方案。有用!

这是因为 Django 1.7 使用 request.REQUEST 返回上述状态变量的 unicode 对象。我之前使用的是 Django 1.6,它用来返回一个字符串。

人们可以在这里找到更多细节。https://github.com/google/google-api-python-client/issues/58 https://github.com/google/google-api-python-client/issues/58我写这篇文章供将来参考。

if not xsrfutil.validate_token(
    settings.SECRET_KEY, 
    str(request.REQUEST['state']), 
    request.user):
return HttpResponseBadRequest()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django 1.7 google oauth2 令牌验证失败 的相关文章

随机推荐

  • 使用 Python 抓取 PDF 文本 (pdfquery)

    我需要抓取一些 PDF 文件来提取以下文本信息 我尝试使用 pdfquery 来完成此操作 方法是解决我在 Reddit 上找到的示例 请参阅第一篇文章 https www reddit com r Python comments 4bnj
  • QTableWidgetItem 文本已更改

    我正在寻找一种干净的方式来对事件做出反应 如果QTableWidgetItem已更改其文本 我尝试过使用信号QTableWidget itemChanged QTableWidgetItem item 但这会导致错误 因为我更改了背景颜色Q
  • 在 C++ 中,“operator !=”是否应该始终通过“operator ==”来实现?

    我目前查看了一个旧的 C 代码库 发现很多代码都是这样的 bool SomeClass operator const SomeClass other const return member1 other member1 member2 ot
  • 优化点-圆距离法

    我正在实施 RANSAC 算法来检测图像中的圆圈 我分析了执行情况 得到 13699392 function calls in 799 981 seconds Random listing order was used ncalls tot
  • Jetpack Compose 中的文本超链接主题标签 (#) 和提及 (@)?

    Jetpack Compose 中的文本超链接主题标签 和提及 Composable fun HashtagsAndMentions val colorScheme MaterialTheme colorScheme val primary
  • 如何在 FeignClient 中调用带有多个查询字符串参数的 url?

    我尝试使用多个查询字符串参数调用 Google API 奇怪的是 我找不到办法做到这一点 这是我的 FeignClient FeignClient name googleMatrix url https maps googleapis co
  • 为什么页脚项目不包含在 Repeater.Items 中?

    我需要在按钮的 OnClick 事件中从 FooterTemplate 内的文本框中获取值 我的第一个想法是循环遍历中继器上的 items property 但正如您在此示例中所看到的 它只包括实际的数据绑定项 而不包括页脚项 ASPX
  • ob_get_clean 和 ob_get_flush 之间的区别

    它们似乎都做同样的事情 将输出缓冲区内容返回给您 然后将其删除 我应该使用哪一个 ob get clean http php net manual en function ob get clean php删除缓冲区 不打印它 并返回其内容
  • Android 中选项卡式视图寻呼机的单独后退导航

    我想要的是 在选项卡滑动菜单上下文中 我想将选项卡内的一个片段替换为另一个片段 并维护选项卡菜单以及当前选项卡 当滑动到另一个选项卡并返回到原始选项卡时 我希望显示最后一个片段 例如 我有tab a with Fragment 1 tab
  • 用于解析数据的正则表达式

    我正在编写一个从简单文本文件中读取一些数据的应用程序 数据文件 我感兴趣的 有以下形式的行 Mem 100 120 Mem 200 231 Mem 43 12 Mem 1293 12 54 所以 正如你所理解的 每条线的模式是这样的 s t
  • 分组然后计算缺失变量?

    我的数据看起来像这样 df1 lt data frame Z sample LETTERS 1 5 size 10000 replace T X1 sample c 1 10 NA 10000 replace T X2 sample c 1
  • 为什么我的 Maven 插件描述符没有自动生成?

    我已经编写了自己的插件项目并运行了命令mvn install通过 cygwin 进行我的插件项目 它的 jar 文件正在我的存储库中创建 但是当我执行我的插件时 它说我的插件描述符不存在 我检查了创建的 jar 文件 实际上它并没有在其中自
  • 密码反应式表单上的自定义验证器并确认密码匹配,将未定义的参数获取到 Angular 4 中

    我正在尝试实现一个自定义验证器来检查密码和密码确认是否相等 问题在于验证器获取未定义的密码和confirmedPassword 参数 我该如何进行这项工作 该函数有效 因为如果我将条件更改为 而不是 当字段相同时它会正确抛出错误 有谁知道这
  • Python Selenium 检测浏览器何时关闭

    现在 我用它来检测用户何时关闭浏览器 while True try do stuff except WebDriverException print User closed the browser exit 但我发现这是非常不可靠的 也是一
  • 当引用的架构文件位于不同的项目/程序集中时,如何在 VS 中指定 XSD schemaLocation 属性?

    EDIT请参阅下面我的解决方案 EDIT 我有一个包含两个项目的 Visual Studio 解决方案 项目 1 称为 ReferencedProject 包含一个 XML 架构文件 ReferencedSchema xsd 项目 2 称为
  • 本地存储库上单个开发人员的 Git 工作流程

    我正在尝试将个人 git 工作流程改进为更容易处理的东西 以下是我在本文中如何使用 git 的一些背景知识 一名开发人员是唯一在存储库上工作的开发人员 存储在本地计算机上的存储库的单个副本 只有两个分支 dev 和 master 所有工作都
  • Postgres递归查询在遍历parent_id时更新字段的值

    这是表 user id parent id lft 1 0 2 1 0 3 1 0 4 2 0 下面是一个查询 从节点 1 开始执行 CTE 遍历 user id 1 的所有子节点 直到到达叶子节点 并将遍历的子节点 lft 字段的值更新为
  • 页面加载动画

    我想在页面加载时显示加载动画 并在加载完成后明显隐藏它 我正在使用 Masterpages 在 ASP NET 中工作 只是想知道有一种使用 JQuery 执行此操作的简单方法吗 任何指示将不胜感激 Thanks 只需将带有 gif 动画的
  • 如何针对 firebase 验证身份验证令牌?

    我的意思不是使用 firebase 进行自定义身份验证 我需要的与在应用程序服务器中生成令牌并允许在 firebase 中访问的自定义身份验证略有不同 实际上 例如 我正在尝试使用电子邮件和密码在 firebase 中进行身份验证 并且通过
  • Django 1.7 google oauth2 令牌验证失败

    我正在尝试完成验证 Google 令牌的过程 以便在 Django 应用程序中访问用户的日历 尽管我遵循了网上找到的一些指示 但我的回调函数仍然收到 400 错误代码响应 错误请求 views py coding utf 8 import