无UI SSH服务器上Python应用授权Google API的问题
无UI服务器下的Google Sheets API授权方案
问题分析
你当前通过本地生成token.json上传服务器的方式,30天后过期的核心原因是:默认授权流程未获取到长期有效的refresh_token,或同一应用多次授权后旧refresh_token被自动失效,导致服务器无法自动刷新凭证。
两种可行解决方案
方案一:修复本地授权流程,获取永久有效refresh_token
修改本地运行的代码,确保授权时强制获取长期可用的refresh_token,服务器后续可自动刷新凭证,无需重复上传:
- 授权前删除本地已有的
token.json - 修改代码中的授权逻辑,添加
prompt='consent'参数:
flow = InstalledAppFlow.from_client_secrets_file("./json/credentials.json", SCOPES) # 强制触发授权同意页面,确保返回refresh_token googleCredentials = flow.run_local_server(port=0, prompt='consent')
- 在本地运行代码完成授权,将新生成的
token.json上传到服务器 - 服务器上的代码会自动通过refresh_token刷新access_token,无需手动重复操作
方案二:直接在无UI服务器上完成授权(控制台模式)
无需本地操作,直接通过SSH连接的服务器控制台完成授权:
- 修改代码中的授权逻辑,替换
run_local_server为run_console:
flow = InstalledAppFlow.from_client_secrets_file("./json/credentials.json", SCOPES) # 使用控制台交互模式,适配无UI环境 googleCredentials = flow.run_console()
- 在服务器上运行代码,控制台会输出授权URL和验证码输入提示
- 在本地浏览器打开该URL,完成Google账号登录授权后获取验证码
- 将验证码输入服务器控制台,即可生成
token.json,后续凭证会自动刷新
关键注意事项
- 确保Google Cloud项目中,OAuth 2.0客户端类型为桌面应用(而非Web应用),否则无法生成有效refresh_token
- 若refresh_token仍失效,检查Google账号安全设置,确认应用权限未被撤销
- 多次授权后旧refresh_token失效时,重新生成一次
token.json即可恢复自动刷新
内容的提问来源于stack exchange,提问作者Simonalbi
相关产品推荐
相关产品推荐

