【问题标题】:Authorization error with Google apps scriptGoogle 应用程序脚本的授权错误
【发布时间】:2020-02-05 21:58:29
【问题描述】:

我没有使用 Google Apps 脚本的经验。我需要与外部 API 通信,但不断收到 {"error":"Authentication failed"} 响应。

如果有人能给我提示我应该在我的代码中更改什么,我将不胜感激。我认为我的授权部分写错了(API文档中写的是:Authorization: WebpageToken realm="api", apikey="testkey123")

以下是我正在尝试使用的 API 文档。

“API 文档: 部分接口功能: 承诺, 雇员, 企业, 客户/:id

API 通信由 RESTful 类型的 HTTPS 请求完成,这些请求发送到: https://the.webpage.com/{CUSTOMER_ID}/api/{ENDPOINT} 其中 {CUSTOMER_ID} 为个人 ID,{ENDPOINT} 为接口函数。响应格式为 JSON。

示例请求(来自文档):

GET /1200/api/customers/1 HTTP/1.1
Host: the.webpage.com
Accept: application/json
Authorization: WebpageToken realm="api", apikey="testkey123"

我试图通过从 stackoverflow 和文档中搜索来找到编写授权的正确方法,但运气不好。

Google Apps 脚本中的我的代码:

function getCorporates(){
  var ENDPOINT = "corporates";
  var apiKey = ”testkey123”; //example
  var CUSTOMER_ID = 1234; //example

  var options = {
    "method":"GET",
    "muteHttpExceptions": true,
    "Authorization":{
      "WebpageToken":{
        "realm":"api",
        "apikey" :apiKey     
         }
    }
  };
  var url = "https://the.webpage.com/" + CUSTOMER_ID + "/api/" + ENDPOINT;
  var response = UrlFetchApp.fetch(url, options); // get api endpoint
  var json = response.getContentText(); // get the response content as text
  Logger.log(json); //log data to logger to check
}

此代码应返回一个 JSON 对象。目前我收到 {"error":"Authentication failed"} 响应。

请注意,我必须“隐藏”公司名称,因此在这种情况下,它已更改为 the.webpage.com,这不是我尝试调用的真实 API 地址。

感谢您的帮助!

【问题讨论】:

  • 您介意分享 API 文档的实际/完整链接吗?此外,您是否尝试过先在应用程序脚本之外测试 API 以查看是否能够实现所需的功能?也许在Postman 上试试?
  • 谢谢!我将原始文档翻译成英文。我提到的“网站”,例如“WebsiteToken”是指出于安全原因修改了原始服务名称,但基本上是服务提供商的名称。它包含客户的敏感健康信息,所以我尽量小心。我尝试了 Postman,但无法弄清楚“授权:WebsiteToken realm="api", apikey="testKey123"" 应该如何实现。这是文档链接:onedrive.live.com/…
  • 通常情况下,如果与授权有关,则主要与 API 和凭据有关。鉴于该设置也不适用于 Postman,我建议您也直接与服务提供商联系一次,以便他们可以正确指导您如何首先发出成功的 API 请求,一旦完成,这将是一个cake 以在 Google Apps 脚本上实现它。
  • 你看过this guide onworking with 3rd party APIs 吗?

标签: authentication google-apps-script


【解决方案1】:

您需要将Authorization 添加为标头,操作如下:

var headers = {
  "Authorization" : "Webpage realm='api', apikey='testkey123'"
};

var params = {
  "method": "GET",
  "muteHttpExceptions": true,
  "headers": headers
};

var response = UrlFetchApp.fetch(url, params);

换句话说,HTTP 标头是 params 对象中它们自己的对象(在我的示例中,options 在您的示例中)。

请参阅“高级参数”下的文档 [0]

[0]https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app#fetch(String,Object)

【讨论】:

  • 非常感谢!我设法通过完全按照您的建议更改代码来使其工作。也感谢所有受访者!
  • 太棒了!如果您能支持我的答案/将其标记为已接受的答案以建立我的声誉得分,我将不胜感激!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-30
  • 2015-02-15
  • 2019-06-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多