【问题标题】:Google push notifications - Unauthorized WebHook callback channelGoogle 推送通知 - 未经授权的 WebHook 回调通道
【发布时间】:2014-07-18 16:31:14
【问题描述】:

我在使用 Google 推送通知(用于驱动器)时遇到问题。我使用的服务帐户非常适用于驱动器更改手表以外的所有其他驱动器操作。

以下是应用程序代码,该代码现在因“未经授权的 WebHook 回调通道”异常而失败。我还转储了调用 drive.changes.watch.execute 时生成的请求和响应。

目标通知地址在 APIs & auth Push 控制面板中被列入白名单(我什至在 Javascript origins 和 referrers 中列出了它),现在我遇到了这个 401 Unauthorized 错误。

有人知道我哪里出错了吗?谢谢你的帮助。

PrivateKey serviceAccountPrivateKey = SecurityUtils.loadPrivateKeyFromKeyStore(SecurityUtils.getPkcs12KeyStore(), p12File, "notasecret", "privatekey", "notasecret");
JsonFactory jsonFactory = new JacksonFactory();
HttpTransport t = GoogleNetHttpTransport.newTrustedTransport();
GoogleCredential gc = new GoogleCredential.Builder()
                .setTransport(t)
                .setJsonFactory(jsonFactory)
                .setServiceAccountScopes(Collections.singleton(DriveScopes.DRIVE))
                .setServiceAccountPrivateKey(serviceAccountPrivateKey)
                .setServiceAccountId(Config.SERVICE_ACCOUNT_ID)
                .setServiceAccountUser(Config.SERVICE_ACCOUNT_USER)
                .build();

drive = new Drive.Builder(t, jsonFactory, null).setHttpRequestInitializer(gc).setApplicationName(cfg.getStringParam(Config.GAE_APPLICATION_NAME)).build();

// THIS WORKS
Changes.List request = drive.changes().list();
ChangeList changes = request.execute();

// THIS DOES NOT WORK
Channel channel = new Channel();
channel.setId(UUID.randomUUID().toString());
channel.setType("web_hook");
channel.setAddress(Config.PUSH_NOTIFICATION_ADDRESS);
Channel c = drive.changes().watch(channel).execute();


-------------- REQUEST  --------------
POST https://www.googleapis.com/drive/v2/changes/watch
Accept-Encoding: gzip
Authorization: Bearer XXX
User-Agent: XXX Google-HTTP-Java-Client/1.17.0-rc (gzip)
Content-Type: application/json; charset=UTF-8
Content-Length: 118

CONFIG: curl -v --compressed -X POST -H 'Accept-Encoding: gzip' -H 'Authorization: Bearer XXX' -H 'User-Agent: XXX Google-HTTP-Java-Client/1.17.0-rc (gzip)' -H 'Content-Type: application/json; charset=UTF-8' -d '@-' -- 'https://www.googleapis.com/drive/v2/changes/watch' << $$$
CONFIG: {"address":"XXX","id":"8078114c-fba0-44e7-a34c-cb391ea40061","type":"web_hook"}

-------------- RESPONSE --------------
401 OK
www-authenticate: Bearer realm="https://accounts.google.com/AuthSubRequest", error=invalid_token

-------------- REQUEST  --------------
POST https://accounts.google.com/o/oauth2/token

-------------- RESPONSE --------------
200 OK
{
  "access_token" : XXX,
  "token_type" : "Bearer",
  "expires_in" : 3600
}

-------------- REQUEST  --------------
POST https://www.googleapis.com/drive/v2/changes/watch

-------------- RESPONSE --------------
401 OK
www-authenticate: Bearer realm="https://accounts.google.com/AuthSubRequest", error=invalid_token

...
...
...

-------------- RESPONSE --------------
200 OK
content-type: application/json; charset=utf-8
cache-control: no-cache, no-store, max-age=0, must-revalidate
pragma: no-cache
expires: Fri, 01 Jan 1990 00:00:00 GMT
date: Wed, 28 May 2014 20:51:19 GMT
content-disposition: attachment; filename="json.txt"; filename*=UTF-8''json.txt
content-encoding: gzip
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
server: GSE
alternate-protocol: 443:quic
transfer-encoding: chunked

{
  "access_token" : XXX,
  "token_type" : "Bearer",
  "expires_in" : 3600
}

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "push.webhookUrlUnauthorized",
    "message": "Unauthorized WebHook callback channel: XXX"
   }
  ],
  "code": 401,
  "message": "Unauthorized WebHook callback channel: XXX"
 }
}

【问题讨论】:

  • 你解决过这个问题吗?遇到同样的问题
  • 半年后,同样的代码,同样的配置,同样的环境,同样的域名等等,现在它可以工作了......
  • FWIW,我今天遇到了这个错误。域验证没有保存在谷歌开发者控制台中(刷新页面,它就消失了)。问题最终是我以两个谷歌账户登录,我的 gmail 账户和我的公司账户。添加域验证似乎对帐户感到困惑并且不保存域设置。希望这对某人有所帮助。
  • @JohnNaegle 这是对我有用的解决方案。谢谢:-)
  • @JohnNaegle 哇。是的,刷新,一切都消失了。 (诊断需要一个半小时)。感谢上帝的评论。我试过重新登录和隐身,同样的结果=>似乎没有真正的保存发生。你有什么特别的事情吗?

标签: java google-api google-drive-api google-api-java-client


【解决方案1】:

您必须将您的域添加到开发者控制台。

如何:

  1. 登录Google Developers Console
  2. 选择您的项目
  3. 在“APIS & AUTH”下选择“推送”
  4. 点击“添加域”
  5. 输入需要的域(只需要域,不需要整个通知 url)
  6. 点击“添加域”按钮

之后它应该可以工作,除非你正在做的事情有其他问题:p

【讨论】:

  • 您还需要添加一个 https url,并拥有有效的(非自签名)SSL 许可证。
  • APIS & AUTH 已移至 Credentials => 域验证
  • 听起来很明显 - 但这对我来说很长一段时间都不起作用,因为我获得的测试访问令牌与 OAuth 游乐场应用程序相关联,而不是我自己的 Google 应用程序(我会如上所述添加域)。
  • 我正在生产中,你知道有什么方法可以在本地测试它吗?
  • 现在的步骤是: 1. 转到 Google Cloud Platform Console。 2. 选择您的项目。 3. 打开左上角的导航侧边栏,选择 APIs & services。 4. 然后选择凭据。选择域验证。 5. 选择添加域。
【解决方案2】:

对于我来说,正如我在上面发表的评论,

域验证没有保存在谷歌开发者控制台中(刷新页面,它就消失了)。问题最终是我以两个谷歌账户登录,我的 gmail 账户和我的公司账户。添加域验证似乎对帐户感到困惑并且不保存域设置。

如果您使用多个 Google 帐户,请尝试使用其他浏览器或隐身会话登录。

【讨论】:

    【解决方案3】:

    所以这完全是因为 console.developers.google.com 上的设置。您需要将后端域添加到(OAuth 同意屏幕选项卡)上的授权域和允许域(域验证选项卡上)。

    所以它现在适用于您的原因可能是您已经验证并添加了您的顶级域,而您的本地环境当时有单独的(不是经过验证的顶级域的子域)域,特别是如果你一直在互联网上暴露你的本地服务器。

    【讨论】:

      【解决方案4】:

      对我来说,我希望回调 webhook URL 为 https://test-apis.domain.io。因此,对于域验证,我添加了test-apis.domain.io,然后尝试修改 TXT 记录,但它从未工作(验证)。

      最后用同样的方法验证了domain.io。完成此操作后,我可以在凭据“域验证”屏幕中添加域 test-apis.domain.io。希望这对其他人也有帮助。

      【讨论】:

        【解决方案5】:

        我确认了我的域,检查了我的 SSL,但问题还没有解决。

        最后我找到了解决方案:在 Google Developers Console 中使用 Service Acconut Key(不是 API 密钥,也不是 OAuth 客户端 ID)。

        【讨论】:

          【解决方案6】:

          我也有同样的问题。其他答案提到需要将您的域添加到 Google Cloud Platform Console -> API 和服务 -> 域验证。我出错的地方是我的域附加了一条路由,所以我试图添加https://www.example.com/route。需要在Google Search Console中验证顶级域的所有权,即https://www.example.com的所有权,然后在域验证中添加顶级域,然后可以使用https://www.example.com/route作为drive.changes.watch()中的地址。

          【讨论】:

            猜你喜欢
            • 2021-04-15
            • 2016-04-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-11-02
            • 2017-07-20
            • 2017-06-06
            • 2018-03-06
            相关资源
            最近更新 更多