在 Google Apps 脚本中使用 CloudKit Web 服务 API 查询 CloudKit 公共数据库时的 AUTHENTICATION_FAILED

Posted

技术标签:

【中文标题】在 Google Apps 脚本中使用 CloudKit Web 服务 API 查询 CloudKit 公共数据库时的 AUTHENTICATION_FAILED【英文标题】:AUTHENTICATION_FAILED when querying CloudKit public database with CloudKit Web Services API in Google Apps Script 【发布时间】:2016-04-20 22:15:41 【问题描述】:

我正在尝试使用 CloudKit Web 服务 API 从 Google Apps 脚本中的生产 CloudKit 容器的公共数据库中获取文章记录。

我的请求基于this page 上的文档。

这是我的代码:

// variables for the CloudKit request URL
var path = "https://api.apple-cloudkit.com";
var version = "1";
var container = "iCloud.com.companyname.My-Container-Name";
var environment = "production";
var database = "public";

var token = "8888888888888_my_actual_token_88888888888888888"

function showArticles() 

  // assemble the URL
  var url = path + "/database/" + version + "/" + container + "/" + environment + "/" + database + "/records/query?ckAPIToken=" + token;

  // specify the record type to query
  var query = 
    recordType: "Article"
  ;

  // specify the payload for the POST request
  var payload = 
    query : query
  ;

  // set up the fetch options for the fetch request
  var options = 
    method : "POST",
    payload : payload
   ;

  // make the request
  var response = UrlFetchApp.fetch(url, options);

  Logger.log(response);

UrlFetchApp.fetch(url, options) 失败并出现此错误:

Request failed for https://api.apple-cloudkit.com/database/1/iCloud.<?>-Container-Name/development/public/records/query?ckAPIToken=8888888888888_my_actual_token_88888888888888888 returned code 401. Truncated server response: "uuid":"7d8a8547-ad08-4090-b4b3-917868a42f6f","serverErrorCode":"AUTHENTICATION_FAILED","reason":"no auth method found" (use muteHttpExceptions option to examine full response) (line 30, file "Code")

我已经进行了几个小时的故障排除,但我无法弄清楚我做错了什么。我也在我的开发环境中使用单独的令牌进行了尝试,同样的事情发生了。

This page 提到了ckWebAuthToken 参数并说“如果省略并需要,则请求失败”,但我找不到任何说明什么请求需要ckWebAuthToken 的内容。我假设我不需要ckWebAuthToken,因为我尝试访问的记录在我容器的公共数据库中,我收到AUTHENTICATION_FAILED 错误而不是AUTHENTICATION_REQUIRED 错误。

让我感到困惑的一个部分是错误消息中出现的这个 URL:

https://api.apple-cloudkit.com/database/1/iCloud.<?>-Container-Name/development/public/records/query?ckAPIToken=8888888888888_my_actual_token_88888888888888888

我希望它是:

https://api.apple-cloudkit.com/database/1/iCloud.com.companyname.My-Container-Name/development/public/records/query?ckAPIToken=8888888888888_my_actual_token_88888888888888888

但我不知道这是否真的是被请求的 URL,当我记录 url 变量时,一切看起来都很好。

提前感谢您提供任何故障排除提示或解决方案!

更新

我尝试使用 Postman,请求使用相同的端点和 POST 数据。看起来 URL 的 container 组件被 Google Apps 脚本 UrlFetchApp.fetch() 方法损坏了。 &lt;?&gt; 似乎只在com. 在 URL 中时出现。

【问题讨论】:

【参考方案1】:

我不确定为什么这是答案,但我能够通过在options 中的payload 上使用JSON.stringify() 使其工作:

var options = 
    method : "POST",
    payload : JSON.stringify(payload)
;

【讨论】:

以上是关于在 Google Apps 脚本中使用 CloudKit Web 服务 API 查询 CloudKit 公共数据库时的 AUTHENTICATION_FAILED的主要内容,如果未能解决你的问题,请参考以下文章

在 Google Apps 脚本中使用 Mandrill API

在 Google Apps 脚本中使用 BigQuery 连接到 Google 电子表格

Google 表单 - 使用 Google Apps 脚本在项目中添加自定义按钮“更多信息”

如何在 Google Apps 脚本中使用服务帐户对 Google 表格进行身份验证

使用 Google Apps 脚本在 Blogger 中创建帖子

使用 Apps 脚本在带有日期的 Google 电子表格中存档