首页 > 编程问答 >Google OAuth2 redirect_uri_mismatch 在生产中出现错误,但在本地工作

Google OAuth2 redirect_uri_mismatch 在生产中出现错误,但在本地工作

时间:2024-07-21 00:57:24浏览次数:9  
标签:python google-drive-api

我正在开发一个项目,需要使用 OAuth2 身份验证更新组织的 Google Drive 令牌。我的代码在本地计算机上运行良好,但是当我将其部署到服务器时,遇到无效的错误redirect_url。这是我的代码的相关部分:

def update_drive_gtoken(
    data: schema.UpdateDriveToken,
    sql: Session,
    auth_token: frontendModel.FrontendToken,
    organization: model.Organization
):
    """
    Update organization drive token
    """
    organization_user = sql.query(model.RegisterUserOrganization).filter_by(
        user_id=auth_token.user_id,
        org_uid=organization.id,
        is_active=True,
        is_deleted=False
    ).first()

    if not organization_user:
        CustomValidations.raize_custom_error(
            error_type="not_exist",
            msg="user does not belong to this organization"
        )

    token_json = None
    if auth_token.user_id == organization.admin_id:
        if data.code is not None:
            CLIENT_ID = "1234.com"
            CLIENT_SECRET = "FXXC"
            REDIRECT_URL = "http://localhost:3000"

            token_url = 'https://oauth2.googleapis.com/token'
            token_data = {
                'code': data.code,
                'client_id': CLIENT_ID,
                'client_secret': CLIENT_SECRET,
                'redirect_uri': REDIRECT_URL,
                'grant_type': 'authorization_code'
            }

            token_response = requests.post(token_url, data=token_data, timeout=80, verify=False)
            token_json = token_response.json()
            extracted_token = {
                'access_token': token_json.get('access_token'),
                'refresh_token': token_json.get('refresh_token'),
                'client_id': CLIENT_ID,
                'client_secret': CLIENT_SECRET,
                'expires_in': (datetime.utcnow() + timedelta(seconds=token_json['expires_in'])).isoformat(),
                'scope': token_json.get('scope'),
                'token_uri': token_url
            }

            if token_response.status_code != 200:
                CustomValidations.raize_custom_error(
                    error_type="invalid",
                    loc="code",
                    msg="Failed to exchange token. Please provide a valid Google token.",
                    inp=str(data.code),
                    ctx={"code": "valid"},
                )

            if organization.gtoken is not None:
                CustomValidations.raize_custom_error(
                    error_type="already_exist",
                    msg=f"token already exists in {organization.title}"
                )

            organization.gtoken = json.dumps(token_json)
            sql.commit()

            return {"organization": organization, "token": extracted_token}

当我在本地运行此代码时,令牌交换工作没有任何问题。但是,在服务器上,我收到以下错误消息:“无效的redirect_url”我不确定为什么这种不匹配仅在生产中发生。有没有人遇到过类似的问题或知道如何解决这个问题?任何帮助将不胜感激。


你遇到的问题是,你在生产环境中使用的 redirect_uri 与你在 Google Cloud Console 中为你的 OAuth 2.0 客户端配置的 redirect_uri 不匹配。

问题原因:

你在代码中将 REDIRECT_URL 硬编码为 http://localhost:3000 。 这是你本地开发环境的正确地址,但不是你生产环境的正确地址。当你将代码部署到服务器时,Google 会将你发送到 http://localhost:3000 ,而这与你配置的授权 redirect_uri 不匹配,因此会出现 redirect_uri_mismatch 错误。

解决方案:

  1. 更新 Google Cloud Console 中的授权 redirect_uri:

  2. 登录 Google Cloud Console (https://console.cloud.google.com/)。

  3. 选择你的项目。
  4. 在左侧导航菜单中,选择 API 和服务 > 凭据
  5. 点击你用于此应用程序的 OAuth 2.0 客户端 ID。
  6. 授权 redirect_uri 部分中,添加你的生产环境的正确 redirect_uri。例如,如果你的应用程序托管在 https://example.com ,则应添加 https://example.com/oauth2callback 或类似的 URL。
  7. 点击 保存

  8. 更新你的代码,使用环境变量或配置设置来动态设置 REDIRECT_URL

  9. 不要将 REDIRECT_URL 硬编码在代码中,而是使用环境变量或配置文件来存储此值。这将使你能够轻松地在不同的环境(例如,本地、测试和生产)中使用不同的 redirect_uri。

```python import os

# 从环境变量中读取 REDIRECT_URL REDIRECT_URL = os.environ.get('GOOGLE_OAUTH_REDIRECT_URL')

# ... 你的代码 ... ```

  1. 确保你的 redirect_uri 符合 Google 的要求:

  2. 必须是有效的 URI(例如, https://example.com/callback )。

  3. 不能包含任何查询参数或片段标识符。
  4. 必须与你在 Google Cloud Console 中为你的 OAuth 2.0 客户端配置的授权 redirect_uri 完全匹配,包括协议(http 或 https)、主机名、端口号和路径。

其他建议:

  • 使用安全的 redirect_uri(https)。
  • 定期检查你的 Google Cloud Console 凭据,确保你的 redirect_uri 和其他设置是最新的。

通过按照上述步骤操作,你应该能够解决 redirect_uri_mismatch 错误,并在生产环境中成功进行 Google OAuth2 身份验证。

标签:python,google-drive-api
From: 78773369

相关文章

  • Python pandas to_csv 导致 OSError: [Errno 22] 参数无效
    我的代码如下:importpandasaspdimportnumpyasnpdf=pd.read_csv("path/to/my/infile.csv")df=df.sort_values(['distance','time'])df.to_csv("path/to/my/outfile.csv")此代码成功从infile.csv(一个3GBcsv文件)读取数据,对其进行排......
  • 从 python 中的字符串列表中提取 def 定义函数的标签
    我想使用Python中的正常def过程创建函数,并将标签分配给从字符串列表中提取的命名空间。如何实现这一点?这个问题的动机:我正在创建一个与sympy兼容的python函数库,供数学家用于符号计算实验。许多函数需要初始化具有相关标签的多个对象的系统,这些标签分别由用户提供的字......
  • 在 Raspberry Pi 4 上使用 Python 从具有 SPI 连接的 MT6816 磁性编码器读取
    我对这个领域完全陌生,并不真正知道自己在做什么并且需要帮助。我正在尝试使用MT681614位磁性编码器通过RaspberryPi的SPI连接读取绝对角度。我有以下问题:在硬件方面,是否只是简单地连接必要的连接(3.3V、MOSI、MISO、SCK、GND、CE01)?对于编码......
  • PythonW 不运行脚本。严重地
    因此,使用Windows10和Python3.6。我创建了一个.py脚本,它可以使用命令pythonmyscript.py在命令提示符下正常运行,但是当我制作该脚本的精确副本并为其赋予扩展名.pyw,并尝试使用pythonw运行它时命令pythonwmyscript.pyw,什么也没有发生......
  • 如何使用Python和Selenium模拟产品购买以获取库存信息
    我正在开发一项网络抓取服务,主要针对时尚行业。我的目标是提供有关产品的全面数据,包括库存水平。为了实现这一目标,我需要模拟购买以确定每种尺寸的产品的最大可用数量。我一直在使用Python和Selenium进行网络抓取部分,但在准确模拟购买方面面临着挑战检索股票信息的过程。......
  • 连接Python套接字的问题
    当我写“关闭”时,我试图让我的电报机器人关闭计算机。我不想将机器人连接到网站上的托管。我选择我的手机(AndroidRedmiNote10)作为托管。我在上面安装了Termux和Pydroid。我写了两个文件:main到我的电脑,client到我的手机。通过在计算机上运行这两个文件,一切正常。但是,当我在......
  • 如何修复导入 Numexpr Python 时的错误
    在Windows10Python3.7.9(IDLE)上,我成功安装了“pipinstallnumexpr”,但在“importnumexprasne”时出现错误:Traceback(最近一次调用):文件“<pyshell#21>”,第267行,位于将numexpr导入为ne文件“C:\Python379\lib\site-packages\numexpr_init_.py”......
  • 让 cpython 优化恒定条件
    我正在用Python编写需要尽可能高效运行的代码,但有时我需要深入挖掘调试语句。不要注释这些输入或输出(或者使用外部预处理器来处理代码,就像这里建议的那样Python相当于#ifdefDEBUG或这里如何在python中实现“#ifdef”?|||)我想在模块的开头定义一个变量......
  • 如何使用 for 循环在 python jupyter 笔记本中创建动态图?
    我正在学习本课关于用Python求解热方程。该课程指出,在求解热方程后,我们可以通过在循环中简单地调用pyplot.plot()来可视化解的动画图,其中下面的代码将动态绘制每次每个点的温度,从而得到一个动画情节(课程帖子中提供了动画情节的示例)。importnumpyfrommatplotlibi......
  • Python:动态爱心代码
    importrandomfrommathimportsin,cos,pi,logfromtkinterimport*CANVAS_WIDTH=640CANVAS_HEIGHT=480CANVAS_CENTER_X=CANVAS_WIDTH/2CANVAS_CENTER_Y=CANVAS_HEIGHT/2IMAGE_ENLARGE=11HEART_COLOR="#FF99CC"defcenter_......