javascript - 通过 Google Apps 脚本 POST 到 Todoist API 时出现 HTTP 错误 "AUTH_CSFR_ERROR"

标签 javascript curl google-apps-script oauth todoist

我正在尝试通过 Google Apps 脚本从 Todoist API 中查询项目,模仿curl POST。

我最初尝试让 OAuth2 工作,但 token 不是持久的,所以我选择了 API's method使用单独的 API token 来交换有效 token 。

使用应用程序脚本的UrlFetchApp class ,我尝试在 Todoist 的 API 的 POST 请求中构造来检索任务项,并且我的 getTodoistToken() 函数确实正在检索有效的 token 响应,但 POST 命令发出以下 403:

"error_tag":"AUTH_CSRF_ERROR","error_code":0,"http_code":403,"error_extra":{"access_type":"web_session"},"error":"AUTH_CSRF_ERROR"}

有人可以推荐一个解决方案吗?非常感谢,代码如下:

function getTodoistToken() {
  var url = "https://todoist.com/api/access_tokens/migrate_personal_token";
  var data = {
    "client_id": "[my unique client_id]",
    "client_secret": "[my unique client_secret]", 
    "personal_token":"[my API token from Todoist dashboard]", 
    "scope": "data:read"
  };
  var payload = JSON.stringify(data);

  var headers = {
    "Content-Type":"application/json", 
  };

  var options = { 
    "method":"POST",
    "contentType" : "application/json",
    "headers": headers,
    "payload" : payload
  };

  var response = UrlFetchApp.fetch(url, options);
  var json = response.getContentText();
  var data = JSON.parse(json);
  return(data.access_token);  

}

function getTodoistTasks(){
  var apiURL = "https://todoist.com/API/v7/sync";

  var data = {
    "token" : getTodoistToken(),
    "sync_token" : '*',
    "resource_types" : '["items"]'
  };

  var payload = JSON.stringify(data);

  Logger.log(payload);
   var headers = {
     "Content-Type":"application/json", 
   };

  var options = { 
    "method":"POST",
    "contentType" : "application/json",
    "headers": headers,
    "payload" : payload,
    "muteHttpExceptions" : true
  };

  var response = UrlFetchApp.fetch(apiURL, options);

  Logger.log(response.getContentText()); 

}

最佳答案

我已经找到答案了。 Todoist API 文档有点含糊,似乎是围绕 POST 请求编写的,但要下载(同步)完整的任务列表,一个简单的 URL 编码的 GET 请求(如下所示)就可以解决问题:

function getTodoistTasks(){
  var apiURL = "https://todoist.com/API/v7/sync";
  var queryString = "?token=" + getTodoistTokenRev() + "&sync_token=%27*%27&resource_types=[%22items%22]";

  //Get params
  var fetchParameters = {};
  fetchParameters.method = 'get';
  fetchParameters.contentType = 'x-www-form-urlencoded';
  fetchParameters.muteHttpExceptions = true;

  //make request and return
  var response = UrlFetchApp.fetch(apiURL + queryString, fetchParameters);
  var syncData = JSON.parse(response.getContentText());
  return(syncData);
}

关于javascript - 通过 Google Apps 脚本 POST 到 Todoist API 时出现 HTTP 错误 "AUTH_CSFR_ERROR",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44570581/

相关文章:

javascript - ASP.NET MVC JQuery Ajax 函数未触发

javascript - 如何将一个对象附加到另一个对象?

curl - 使用 s_client 而不是 curl 访问带有客户端证书的服务器?

google-apps-script - 一步管理100多个点击

javascript - 您可以将索引号数组传递给数组 push 方法,而不是在 push 中具体指定每个索引吗

javascript - 在 selenium 中选择 SVG 标签内的 g

javascript - 设置 slider Bootstrap 值

php - 如何启用 php curl 扩展

python - 使用多个并行线程分部分下载大文件

google-apps-script - 如何暂停应用脚本直到电子表格完成计算