Flask+Colab中Google OAuth问题:run_console错误及登录异常求助
Flask+Google OAuth在Colab中三类问题的解决方案
1. AttributeError: 'InstalledAppFlow' object has no attribute 'run_console'
- 问题根源:
run_console()是Google Auth旧版本中面向桌面应用的授权方法,新版本已移除,且Flask作为Web应用,完全不适用桌面应用的授权流程。 - 解决办法:
- 优先改用Web应用专属的
AuthorizationCodeFlow流程(长期适配方案); - 若暂时不想调整代码结构,可降级库版本:
pip install google-auth-oauthlib==0.4.6,但不推荐长期使用此方法。
- 优先改用Web应用专属的
2. 点击登录按钮不跳转Google登录页,终端输出链接
- 问题根源:当前代码使用了桌面应用的授权逻辑(如
run_console或run_local_server),且redirect_uri设置为urn:ietf:wg:oauth:2.0:oob(桌面应用离线回调标识),导致流程直接在终端输出链接而非前端跳转;另外Colab是远程环境,本地端口未暴露,Google无法正常回调。 - 解决办法:
- 给Flask添加回调路由(如
/callback),并在Google Cloud Console的OAuth客户端设置中,将redirect_uri配置为该路由的公网HTTPS地址(Colab需通过ngrok或内置端口转发工具暴露应用); - 修改授权逻辑,生成Google授权URL后,在Flask登录路由中直接重定向至该URL,示例代码:
from google_auth_oauthlib.flow import Flow from flask import redirect, session # 初始化Web应用类型的Flow flow = Flow.from_client_secrets_file( 'client_secret.json', scopes=['https://www.googleapis.com/auth/drive.metadata.readonly'], redirect_uri='https://你的ngrok公网地址/callback' ) @app.route('/login') def login(): auth_url, state = flow.authorization_url(access_type='offline', prompt='consent') session['state'] = state # 存储state防止CSRF攻击 return redirect(auth_url) - 在Colab中暴露Flask端口:先安装
pyngrok(!pip install pyngrok),配置ngrok token后,启动端口转发(如转发5000端口),获取公网HTTPS地址。
- 给Flask添加回调路由(如
3. Error 403: access_denied
- 问题根源:
redirect_uri不匹配:代码中的回调地址与Google Cloud Console配置的地址不一致;- OAuth客户端类型错误:创建的是桌面应用类型的客户端ID,而非Web应用类型;
- Colab应用未正确暴露:Google无法访问你的回调路由;
- 若为偶发情况可能是用户主动拒绝权限,但反复出现则必然是配置问题。
- 解决办法:
- 检查Google Cloud Console的OAuth 2.0客户端ID设置:
- 确保客户端类型为Web应用,而非桌面应用或其他类型;
- 添加正确的
redirect_uri,格式如https://xxxx-xx-xx-xx-xx.ngrok-free.app/callback,必须使用HTTPS协议;
- 保证代码中的
redirect_uri与控制台配置完全一致,包括协议、域名、路由路径的细节; - 确认Colab的Flask应用已通过ngrok或Colab内置端口转发,成为公网可访问的HTTPS服务;
- 检查API权限:确保在Google Cloud Console中启用了Google Drive API,且请求的scope为合法权限范围。
- 检查Google Cloud Console的OAuth 2.0客户端ID设置:
内容的提问来源于stack exchange,提问作者Kelvin Loh
相关产品推荐
相关产品推荐

