You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google OAuth 2.0重定向URI不匹配问题排查及生产部署方案咨询

Google OAuth 2.0重定向URI不匹配问题排查及生产部署方案咨询

看起来你遇到的核心问题是本地测试用的OAuth Flow和远程环境(比如GitHub Pages)的适配冲突,咱们一步步拆解解决:


一、先解决当前的redirect_uri_mismatch错误

你踩了一个很常见的坑:run_local_server()这个方法是Google专门为本地桌面/开发场景设计的——它会自动启动本地8000端口的临时服务器,并且强制忽略你手动传入的redirect_uri参数,固定使用http://localhost:8000/作为重定向地址。这就是为什么你已经在Google Console更新了URI,却还是收到localhost相关的错误。

调整方案(本地适配远程URI测试)

如果要在本地测试适配GitHub Pages的重定向URI,必须换掉run_local_server(),改用适合Web应用场景的Flow实现,手动控制授权流程:

from google_auth_oauthlib.flow import Flow

# 替换成你在Google Console配置的GitHub Pages完整URI(必须和配置的完全一致,包括https/结尾斜杠)
YOUR_REDIRECT_URI = "https://yourusername.github.io/your-repo-path/"

flow = Flow.from_client_secrets_file(
    'Gmail Extraction/client_secret.json',
    scopes=SCOPES,
    redirect_uri=YOUR_REDIRECT_URI
)

# 生成授权URL
authorization_url, state = flow.authorization_url(
    access_type='offline',
    prompt='consent'
)

print(f"请在浏览器打开以下URL完成授权:{authorization_url}")
# 用户授权后,会跳转到你设置的redirect_uri,URL中会携带code参数
# 让用户复制回调URL里的code值粘贴到脚本中
auth_code = input("请输入授权后URL中的code参数:")

# 用code换取令牌
flow.fetch_token(code=auth_code)
creds = flow.credentials

额外检查Google Console配置

  • 确保你在OAuth 2.0客户端ID的设置中,把GitHub Pages的完整URI(比如https://yourusername.github.io/your-repo/)添加到「已授权的重定向URI」列表
  • 注意:Google要求生产级重定向URI必须是HTTPS协议(localhost除外),且路径、结尾斜杠必须和代码中的完全一致,不能有通配符

二、生产部署的可行方案

你的核心需求是把Gmail令牌生成逻辑部署到线上,这里给你几个落地性强的选项:

1. 轻量Web服务部署(最推荐)

把脚本改成简单的Web服务(比如用Flask/FastAPI),直接处理OAuth的回调请求,不需要用户手动复制code。举个Flask简化示例:

from flask import Flask, request, redirect
from google_auth_oauthlib.flow import Flow
import os

app = Flask(__name__)
SCOPES = ['https://www.googleapis.com/auth/gmail.readonly']
# 生产环境用环境变量存储敏感信息,不要硬编码
REDIRECT_URI = os.getenv("GOOGLE_REDIRECT_URI")

@app.route('/auth')
def start_auth():
    flow = Flow.from_client_secrets_file(
        'client_secret.json',
        scopes=SCOPES,
        redirect_uri=REDIRECT_URI
    )
    auth_url, _ = flow.authorization_url(access_type='offline', prompt='consent')
    return redirect(auth_url)

@app.route('/callback')
def auth_callback():
    flow = Flow.from_client_secrets_file(
        'client_secret.json',
        scopes=SCOPES,
        redirect_uri=REDIRECT_URI
    )
    flow.fetch_token(code=request.args.get('code'))
    creds = flow.credentials
    # 这里建议加密后存储令牌(比如用数据库、云存储),不要明文保存
    return "授权成功!你的Gmail访问令牌已安全存储。"

if __name__ == '__main__':
    # 生产环境请用Gunicorn/UVicorn等WSGI服务器,不要用debug模式
    app.run(host='0.0.0.0', port=os.getenv("PORT", 5000))

部署平台可选:Heroku、Render、Vercel(支持Python)、AWS Elastic Beanstalk,这些平台都能自动分配公网域名,且支持HTTPS。

2. Serverless函数部署(无服务器维护)

如果不想长期运行Web服务,可以用AWS Lambda、Google Cloud Functions、Vercel Functions等Serverless服务,只处理OAuth的授权和回调逻辑。好处是按需付费,不需要关心服务器运维,适合低流量场景。

生产环境安全必做

  • 绝对不要把client_secret.json提交到代码仓库,用环境变量存储敏感信息
  • 生产环境必须用HTTPS的重定向URI(Google OAuth强制要求,localhost除外)
  • 存储用户令牌时要加密,避免明文泄露用户的Gmail权限

备注:内容来源于stack exchange,提问作者Saurav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 14:23:01