AWS服务器部署的Streamlit应用无法远程认证Google Drive API求助
解决AWS EC2上Streamlit应用Google Drive OAuth认证远程访问问题
问题根源
本地运行正常是因为Google OAuth默认用localhost作为回调地址,本地浏览器能直接访问完成授权跳转。但部署到EC2远程服务器后,用户浏览器无法访问服务器的localhost,导致授权流程中断,服务器才会提示使用--noauth_local_webserver参数。
解决方案
方案1:手动授权模式(快速临时解决)
启动Streamlit应用时添加指定参数,切换为手动输入授权码的认证模式:
streamlit run your_app.py -- --noauth_local_webserver
- 用户触发认证后,服务器会输出一个Google授权URL,用户需复制该URL到自己浏览器打开,完成Google账号授权
- 授权完成后,Google会返回一个授权码,用户把这个码输入到应用的终端提示框,即可完成认证
缺点:对非技术用户不友好,需要手动复制URL和输入授权码。
方案2:配置公开回调地址(生产环境推荐)
通过Google Cloud Console配置适配远程服务器的回调地址,实现自动跳转授权:
- 登录Google Cloud Console,进入你的项目,导航到「API和服务」→「凭据」
- 找到对应的OAuth 2.0客户端ID(即错误信息中的
client_id),点击编辑 - 在「已授权的重定向URI」列表中,添加你的EC2服务器公网访问地址,格式示例:
- 用公网IP:
http://<EC2公网IP>:8501/(Streamlit默认端口为8501,需和实际端口一致) - 用自定义域名:
https://your-domain.com/(生产环境推荐用HTTPS)
- 用公网IP:
- 保存配置后,修改Streamlit应用代码,将Google认证客户端的
redirect_uri参数设置为刚才配置的地址:- 若使用
google-auth库:from google_auth_oauthlib.flow import Flow flow = Flow.from_client_secrets_file( 'client_secrets.json', scopes=['https://www.googleapis.com/auth/drive', 'https://www.googleapis.com/auth/drive.file', 'https://www.googleapis.com/auth/drive.metadata.readonly'], redirect_uri='http://<EC2公网IP>:8501/' # 替换为你的回调地址 ) - 若使用
pydrive2库,修改settings.yaml中的redirect_uri字段:client_config: client_id: "你的client_id" client_secret: "你的client_secret" redirect_uri: "http://<EC2公网IP>:8501/"
- 若使用
- 重启EC2上的Streamlit应用,用户现在可以直接在浏览器中完成OAuth授权跳转,无需手动操作。
注意事项
- 确保EC2安全组开放了应用使用的端口(如8501),允许外部IP访问
- 生产环境建议配置HTTPS,避免明文传输授权信息,同时Google OAuth对HTTPS回调地址的兼容性更好
- 授权范围(scope)保持原有配置即可,无需调整
内容的提问来源于stack exchange,提问作者lungsang
相关产品推荐
相关产品推荐

