单用户身份验证工作流

与服务账号工作流类似, 单用户身份验证流程也利用 Google Ads 界面提供的授权和用户 管理功能,向应用授予对所有 必要账号的访问权限。此身份验证工作流包含两个步骤:

  • 您向单个用户授予对应用应管理的所有 Google Ads 账号 的访问权限。
  • 用户授权您的应用代表他们管理其 Google Ads 账号,从而向应用授予对所有 Google Ads 账号的访问权限。

由于只涉及一个用户,因此您可以依赖 gcloud CLI 或 GenerateUserCredential 代码 示例 等工具,而无需构建自己的 OAuth 2.0 用户身份验证流程。

此工作流的相关用例是,您的账号可以通过少量用户登录信息(例如 3 到 4 个用户)进行访问,因此,与使用 gcloud CLI 等命令行工具为 3 到 4 个用户获取授权的工作量相比,构建完整的 OAuth 多用户身份验证工作流的开发工作量并不划算。

缺点

与服务账号工作流相比,此流程存在以下几个缺点:

  1. 用户身份验证工作流要求您在 Google Cloud 控制台中创建 OAuth 2.0 客户端 ID 和密钥,这比创建服务账号和密钥需要更多配置步骤。
  2. 如果获得授权的用户离开团队或公司,那么如果您从账号中移除该用户或停用该用户账号,您的应用可能会停止运行。服务账号不与单个用户绑定,因此可以避免此风险。
  3. 授权 Google Ads 账号的用户应在其 Google 账号中启用 通行密钥,以防其 Google 账号因安全性差、恶意软件或钓鱼式攻击而遭到入侵。服务账号不需要启用通行密钥,并且不太容易受到此问题的影响,因为某些攻击模式并不直接适用于服务账号。

生成凭据

  1. 为您的应用配置 OAuth 权限请求页面,并添加 https://www.googleapis.com/auth/adwords 作为 OAuth 2.0 范围。如需了解详情,请参阅设置 OAuth 权限请求页面 。

  2. 按照 说明创建客户端 ID 和客户端密钥。创建 OAuth 2.0 客户端后,点击确认对话框中的下载 JSON 按钮,下载客户端的 JSON 文件。将该文件另存为 credentials.json。

  3. 确定一个用户账号,该账号有权访问您想要 使用应用管理的所有 Google Ads 账号。如果存在缺少访问权限的账号,请向该用户 授予账号访问权限。

  4. 下载并安装 gcloud CLI。安装完成后,在命令行提示符下运行 gcloud version 命令,验证该工具是否正常运行。输出类似于以下内容:

    gcloud version
    Google Cloud SDK 492.0.0
    alpha 2024.09.06
    beta 2024.09.06
    bq 2.1.8
    bundled-python3-unix 3.11.9
    core 2024.09.06
    enterprise-certificate-proxy 0.3.2
    gcloud-crc32c 1.0.0
    
  5. 使用上一步中的 credentials.json 文件运行 gcloud CLI 工具,生成 OAuth 2.0 刷新令牌。您需要传递 --client-id-file,以便在您的 Google API 控制台项目(而不是 gcloud CLI 的默认项目)下颁发刷新令牌:

    gcloud auth application-default login \
      --scopes=https://www.googleapis.com/auth/adwords,https://www.googleapis.com/auth/cloud-platform \
      --client-id-file=PATH_TO_CREDENTIALS_JSON
  6. gcloud 命令会在新的浏览器窗口中打开 Google 账号登录窗口,并引导您完成 OAuth 2.0 身份验证步骤。请确保您以在上一步中选择的用户身份登录。如果您的应用 未经验证,您可能会看到警告屏幕。在这种情况下, 您可以安全地点击高级 链接,然后点击前往 PROJECT_NAME(不安全) 选项。

  7. 验证范围后,点击继续 按钮以授予权限。浏览器会转到 https://cloud.google.com/sdk/auth_success,表明身份验证成功。该页面会显示以下消息:

    Authorization code granted. Close this tab.

    gcloud 命令会输出以下消息:

    Credentials saved to file: [/****/.config/gcloud/application_default_credentials.json]
    

    打开 application_default_credentials.json 文件。其内容类似于以下内容:

    {
      "account": "",
      "client_id": "******.apps.googleusercontent.com",
      "client_secret": "******",
      "refresh_token": "******",
      "type": "authorized_user",
      "universe_domain": "googleapis.com"
    }
    

客户端库配置

选择与您的编程语言对应的标签页,查看有关如何配置客户端库的说明。如果获得授权的用户通过 Google Ads 经理账号访问客户账号,请将 login-customer-id(或 loginCustomerId)设置为该经理账号的 10 位数客户 ID,不含连字符。

Java

在 ads.properties 文件中配置以下键。

api.googleads.clientId=INSERT_OAUTH2_CLIENT_ID_HERE
api.googleads.clientSecret=INSERT_OAUTH2_CLIENT_SECRET_HERE
api.googleads.refreshToken=INSERT_OAUTH2_REFRESH_TOKEN_HERE
api.googleads.loginCustomerId=INSERT_LOGIN_CUSTOMER_ID_HERE

如需了解其他选项,请参阅配置指南。

.NET

在 GoogleAdsConfig 实例上设置 OAuth 2.0 凭据,并使用该实例初始化 GoogleAdsClient 对象。

GoogleAdsConfig config = new GoogleAdsConfig()
{
    OAuth2Mode = OAuth2Flow.APPLICATION,
    OAuth2ClientId = "INSERT_OAUTH2_CLIENT_ID_HERE",
    OAuth2ClientSecret = "INSERT_OAUTH2_CLIENT_SECRET_HERE",
    OAuth2RefreshToken = "INSERT_OAUTH2_REFRESH_TOKEN_HERE",
    LoginCustomerId = "INSERT_LOGIN_CUSTOMER_ID_HERE",
};
GoogleAdsClient client = new GoogleAdsClient(config);

如需了解其他选项,请参阅配置指南。

Python

在 google-ads.yaml 文件中配置以下键。

client_id: INSERT_OAUTH2_CLIENT_ID_HERE
client_secret: INSERT_OAUTH2_CLIENT_SECRET_HERE
refresh_token: INSERT_OAUTH2_REFRESH_TOKEN_HERE
login_customer_id: INSERT_LOGIN_CUSTOMER_ID_HERE
use_proto_plus: True

如需了解其他选项,请参阅配置指南。

PHP

在 google_ads_php.ini 中配置以下键。

[GOOGLE_ADS]
loginCustomerId = "INSERT_LOGIN_CUSTOMER_ID_HERE"

[OAUTH2]
clientId = "INSERT_OAUTH2_CLIENT_ID_HERE"
clientSecret = "INSERT_OAUTH2_CLIENT_SECRET_HERE"
refreshToken = "INSERT_OAUTH2_REFRESH_TOKEN_HERE"

如需了解其他选项,请参阅配置指南。

Ruby

在您的 google_ads_config.rb文件中配置以下键。

Google::Ads::GoogleAds::Config.new do |c|
  c.client_id = 'INSERT_OAUTH2_CLIENT_ID_HERE'
  c.client_secret = 'INSERT_OAUTH2_CLIENT_SECRET_HERE'
  c.refresh_token = 'INSERT_OAUTH2_REFRESH_TOKEN_HERE'
  c.login_customer_id = 'INSERT_LOGIN_CUSTOMER_ID_HERE'
end

如需了解其他选项,请参阅配置指南。

Perl

在 googleads.properties 文件中配置以下键。

clientId=INSERT_OAUTH2_CLIENT_ID_HERE
clientSecret=INSERT_OAUTH2_CLIENT_SECRET_HERE
refreshToken=INSERT_OAUTH2_REFRESH_TOKEN_HERE
loginCustomerId=INSERT_LOGIN_CUSTOMER_ID_HERE

如需了解其他选项,请参阅配置指南。

curl

首先,使用 HTTP 客户端获取 OAuth 2.0 访问令牌。本指南使用 curl 命令。

curl \
  --data "grant_type=refresh_token" \
  --data "client_id=CLIENT_ID" \
  --data "client_secret=CLIENT_SECRET" \
  --data "refresh_token=REFRESH_TOKEN" \
  https://oauth2.googleapis.com/token

您可以在 API 调用中使用访问令牌。以下示例 展示了如何使用 GoogleAdsService.SearchStream 方法运行广告系列报告,以检索您账号中的 广告系列。本指南不介绍 报告的详细信息。

curl -i -X POST \
  https://googleads.googleapis.com/v26/customers/CUSTOMER_ID/googleAds:searchStream \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  -H "login-customer-id: LOGIN_CUSTOMER_ID" \
  --data-binary "@query.json"

query.json 的内容如下:

{
  "query": "SELECT campaign.id, campaign.name, campaign.network_settings.target_content_network FROM campaign ORDER BY campaign.id"
}