如何通过API自动生成Google Refresh Token?规避手动操作与网络限制
Google OAuth 令牌自动化生成解决方案
方案一:使用服务账号(Service Account)实现全后端自动化
这是最适配你场景的方案,完全无需用户交互,也不用处理 refresh token 过期问题,直接在后端完成认证。
操作步骤:
- 登录 Google Cloud 控制台,创建服务账号并下载对应的 JSON 密钥文件(存放在安全路径,禁止提交到代码仓库)。
- 给服务账号分配目标 API 访问权限:
- 访问团队共享的 Google Workspace 资源(如表格、文档):直接在资源共享设置里添加服务账号邮箱,赋予对应权限(只读/编辑)。
- 访问用户个人非共享数据:需要 Google Workspace 管理员开启域级授权,并配置对应 API 权限范围。
- Python 代码实现认证:
from google.oauth2 import service_account from googleapiclient.discovery import build # 替换为你的服务账号密钥文件路径 SERVICE_ACCOUNT_KEY_PATH = "./service-account-key.json" # 替换为你需要的 API 权限范围(如 Sheets、Drive 等) API_SCOPES = ["https://www.googleapis.com/auth/spreadsheets.readonly"] # 生成凭据,自动处理令牌刷新 credentials = service_account.Credentials.from_service_account_file( SERVICE_ACCOUNT_KEY_PATH, scopes=API_SCOPES ) # 构建 API 客户端(以 Sheets API 为例) service = build("sheets", "v4", credentials=credentials) # 后续 API 调用示例 sheet = service.spreadsheets() result = sheet.values().get(spreadsheetId="你的表格ID", range="Sheet1!A1:C5").execute() values = result.get("values", [])
方案二:基于用户 OAuth 流程的自动化(仅当必须使用个人账号时)
如果必须用个人 Google 账号访问数据,可通过以下方式解决 localhost 限制和手动操作问题:
解决 localhost 限制:
- 配置公网可访问的回调端点(如公司内部服务器的简单 HTTP 服务、云服务器端点),在 Google Cloud 控制台的 OAuth 客户端设置中,将重定向 URI 替换为该公网地址。
- 若无法部署公网端点,可用无头浏览器(如 Selenium)自动化首次授权流程,在服务器端模拟浏览器操作完成授权,避免手动复制 URL。
实现令牌自动刷新:
首次授权时,代码需设置 access_type="offline",这样会返回长期有效的 refresh token(注意:Google 对部分客户端类型的 refresh token 会设有效期,建议选择「桌面应用」类型以获得更稳定的令牌)。后续脚本可自动用 refresh token 获取新的 access token:
from google.oauth2.credentials import Credentials from googleapiclient.discovery import build from google.auth.transport.requests import Request # 首次授权后保存的凭据文件(含 refresh_token) TOKEN_FILE = "./token.json" # 加载凭据,自动刷新过期令牌 creds = Credentials.from_authorized_user_file(TOKEN_FILE, API_SCOPES) if creds.expired and creds.refresh_token: creds.refresh(Request()) # 保存刷新后的凭据 with open(TOKEN_FILE, "w") as token: token.write(creds.to_json()) # 构建 API 客户端 service = build("sheets", "v4", credentials=creds)
自动化首次授权流程(可选):
用 Selenium 模拟浏览器完成授权,避免手动操作:
from selenium import webdriver from selenium.webdriver.common.by import By import time from google_auth_oauthlib.flow import Flow from google.auth.transport.requests import Request # 配置 OAuth 流 flow = Flow.from_client_secrets_file( "./client_secret.json", scopes=API_SCOPES, redirect_uri="你的公网回调地址" ) # 获取授权 URL authorization_url, state = flow.authorization_url(access_type="offline", prompt="consent") # 无头模式启动 Chrome options = webdriver.ChromeOptions() options.add_argument("--headless=new") driver = webdriver.Chrome(options=options) driver.get(authorization_url) # 模拟输入账号密码(注意:仅在受控环境使用,避免明文存储密码) driver.find_element(By.ID, "identifierId").send_keys("你的Google账号") driver.find_element(By.ID, "identifierNext").click() time.sleep(2) driver.find_element(By.NAME, "Passwd").send_keys("你的密码") driver.find_element(By.ID, "passwordNext").click() time.sleep(3) # 获取回调后的 URL 并交换令牌 callback_url = driver.current_url flow.fetch_token(authorization_response=callback_url) # 保存凭据 with open(TOKEN_FILE, "w") as token: token.write(flow.credentials.to_json()) driver.quit()
注意:无头浏览器存储账号密码存在安全风险,建议优先手动完成首次授权,后续依赖 refresh token 自动刷新。
内容的提问来源于stack exchange,提问作者KingWolin
相关产品推荐
相关产品推荐

