Google OAuth redirect_uri不匹配求助:Python应用同步Gmail附件到Drive
解决OAuth redirect_uri_mismatch错误的方案
核心问题原因
你使用的是Web应用类型的OAuth客户端ID,但代码默认调用了适配桌面/本地应用的授权流程(自动生成localhost回调地址),和你配置的域名URI不匹配,从而触发错误。
具体解决步骤
1. 替换授权流程,显式指定redirect_uri
不要用InstalledAppFlow(这是给本地应用设计的,会自动生成localhost地址),改用适配Web应用的Flow类,手动指定你配置的回调URI:
from google_auth_oauthlib.flow import Flow # 初始化Flow时明确指定redirect_uri flow = Flow.from_client_secrets_file( 'credentials.json', scopes=['https://www.googleapis.com/auth/gmail.readonly', 'https://www.googleapis.com/auth/drive.file'], redirect_uri='https://你的域名.com/回调路径' ) # 生成授权URL authorization_url, state = flow.authorization_url( access_type='offline', include_granted_scopes='true' ) print(f"请访问此链接授权:{authorization_url}")
2. 确保credentials.json格式正确
检查你的credentials.json是web类型配置,且redirect_uris数组包含你在控制台设置的完整URI:
{ "web": { "client_id": "你的客户端ID", "client_secret": "你的客户端密钥", "redirect_uris": ["https://你的域名.com/回调路径"], "auth_uri": "https://accounts.google.com/o/oauth2/auth", "token_uri": "https://oauth2.googleapis.com/token" } }
3. 搭建回调服务接收授权码
Web应用需要自己搭建HTTP服务处理Google的回调请求,获取授权码后交换令牌。比如用Flask写一个简单的回调接口:
from flask import Flask, request from google_auth_oauthlib.flow import Flow app = Flask(__name__) @app.route('/回调路径') def oauth_callback(): # 初始化Flow时参数要和生成授权URL时一致 flow = Flow.from_client_secrets_file( 'credentials.json', scopes=['https://www.googleapis.com/auth/gmail.readonly', 'https://www.googleapis.com/auth/drive.file'], redirect_uri='https://你的域名.com/回调路径' ) # 用回调中的code交换令牌 flow.fetch_token(code=request.args.get('code')) credentials = flow.credentials # 保存令牌到文件,供后续同步代码使用 with open('token.json', 'w') as f: f.write(credentials.to_json()) return "授权完成,可关闭此页面" if __name__ == '__main__': # 注意:生产环境必须用HTTPS,本地测试可临时用HTTP但需在控制台添加对应localhost URI app.run(host='0.0.0.0', port=443, ssl_context=('你的证书.pem', '你的密钥.pem'))
4. 验证控制台配置一致性
再次检查Google Cloud控制台中,Web应用类型OAuth客户端ID的授权重定向URI,必须和credentials.json、代码中指定的URI完全一致(包括HTTPS/HTTP、路径、末尾是否带斜杠等细节)。
内容的提问来源于stack exchange,提问作者RedChair
相关产品推荐
相关产品推荐

