You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何取消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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 15:26:09