在没有刷新令牌的情况下获取 AdWords customerId

Posted

技术标签:

【中文标题】在没有刷新令牌的情况下获取 AdWords customerId【英文标题】:Getting AdWords customerId without a refresh token 【发布时间】:2015-07-31 23:46:31 【问题描述】:

我正在开发一个允许用户连接 AdWords 帐户的网络应用程序。 1) 因此,一旦用户连接了他们的 AW 帐户,我就会从 AW API 获取令牌,其中包括访问令牌和刷新令牌。到目前为止一切顺利,这只是一个典型的 OAuth2 流程。

2) 下次另一个用户连接同一个 AW 帐户时,AW 不会向我提供刷新令牌,假设我将它存储在某个地方,这是预期的。

所以这就是问题所在,似乎没有办法在没有刷新令牌的情况下获取用户信息,这意味着我无法识别用户来检索刷新令牌。

我正在使用 .NET 库 (Google.Apis.Analytics.v3),它不允许我在不提供刷新令牌的情况下请求客户信息...

这里是示例代码:

var tokenResponse = await adWordsService.ExchangeCodeForTokenAsync(code, redirectUri);
var adWordsUser = adWordsService.GetAdWordsUser();
var customerService = (CustomerService)adWordsUser.GetService(AdWordsService.v201502.CustomerService);
var customer = customerService.get();

adWordsService 只是 API 的封装。 所以当我执行这行var customer = customerService.get() 时,我收到以下错误:

ArgumentNullException:值不能为空。

参数名称:AdWords API 需要开发者令牌。如果没有,可以参考https://developers.google.com/adwords/api/docs/signingup的说明领取。

Google.Api.Ads.AdWords.Lib.AdWordsSoapClient.InitForCall(String methodName, Object[] 参数)

开发者令牌和所有客户端 ID 都在那里。

如果我在拨打电话之前添加此行 adWordsUser.Config.AuthToken = tokenResponse.AccessToken;,它会抱怨刷新令牌。

ArgumentNullException:值不能为空。

参数名称:您的应用程序似乎未配置为正确使用 OAuth2。缺少必需的 OAuth2 参数 RefreshToken。您可以运行 Common\Utils\OAuth2TokenGenerator.cs 来生成默认的 OAuth2 配置。

Google.Api.Ads.Common.Lib.OAuth2ProviderBase.ValidateOAuth2Parameter(String propertyName, String propertyValue)

那么问题是,为了存储刷新令牌,如何在身份验证期间获取用户信息(在本例中为customerId,根据本文https://developers.google.com/adwords/api/docs/guides/optimizing-oauth2-requests#authenticating_multiple_accounts)?

【问题讨论】:

【参考方案1】:

所以我刚刚发现问题出在adWordsService。创建AdWordsUser 时,不会为其分配包含最新身份验证令牌的更新身份验证提供程序。添加此身份验证提供程序后,AdWordsUser 不会尝试刷新令牌,因为令牌尚未过期,因此不需要刷新令牌。

【讨论】:

以上是关于在没有刷新令牌的情况下获取 AdWords customerId的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 OAuth2 为 AdWords 帐户生成刷新令牌

是否可以在没有刷新令牌的情况下检查 JWT 有效性?

Google Adwords API - 刷新令牌 - python

Angular 8:如何在没有刷新令牌的情况下刷新令牌

如何在没有 SSL 的情况下使用刷新令牌刷新谷歌访问令牌?

以编程方式获取 Google Adwords 开发者令牌