如何取消Python连接BigQuery时的OAuth 2.0重复验证?
解决BigQuery OAuth2每次运行都要验证的问题
你遇到的核心问题是代码每次启动都重新走完整授权流程,没把生成的凭据持久化保存。只要把授权后的凭据存到本地文件,下次直接加载就能跳过重复验证步骤。
具体做法:
- 首次授权成功后,将
credentials对象保存到本地JSON文件(比如token.json) - 后续运行时先检查该文件是否存在,存在直接加载凭据,不存在再触发授权流程
修改后的代码如下:
from google_auth_oauthlib import flow from google.cloud import bigquery from google.oauth2.credentials import Credentials import os # 定义配置参数 TOKEN_FILE = "token.json" SCOPES = ["https://www.googleapis.com/auth/bigquery"] CLIENT_SECRETS_FILE = "client_secrets.json" PROJECT_ID = 'user-project-id' def get_credentials(): # 优先读取本地已保存的凭据 if os.path.exists(TOKEN_FILE): return Credentials.from_authorized_user_file(TOKEN_FILE, SCOPES) # 本地无凭据时触发授权流程 appflow = flow.InstalledAppFlow.from_client_secrets_file( CLIENT_SECRETS_FILE, SCOPES ) # 首次授权用浏览器验证,完成后自动保存凭据 appflow.run_local_server(port=0) with open(TOKEN_FILE, "w") as token_file: token_file.write(appflow.credentials.to_json()) return appflow.credentials # 初始化客户端并执行查询 credentials = get_credentials() client = bigquery.Client(project=PROJECT_ID, credentials=credentials) query_string = """SELECT name, SUM(number) as total FROM `bigquery-public-data.usa_names.usa_1910_current` WHERE name = 'William' GROUP BY name; """ query_job = client.query(query_string) for row in query_job.result(): print("{}: {}".format(row["name"], row["total"]))
补充说明
- 第一次运行仍需浏览器授权一次,完成后当前目录会生成
token.json - 后续启动代码会自动读取本地凭据,无需再手动确认
- 若凭据过期(默认有效期7天),google-auth库会自动刷新令牌,无需额外操作
内容的提问来源于stack exchange,提问作者tcblue
相关产品推荐
相关产品推荐

