从Google Apps脚本服务JSON为“用户访问网络应用”

时间:2013-04-25 20:12:24

标签: json authentication google-apps-script

尝试将Google Apps脚本发出的JSON请求作为发出请求的用户。经过一段时间的思考,我意识到这不起作用,因为服务脚本需要被授权以调用他的用户身份运行,因此调用脚本必须添加一些授权信息,而不是,我不知道如何添加该信息(这实际上是我的问题:要添加到http请求的哪些信息,以及从哪里获取它)。

但是,当我从浏览器中调用该服务器时,它的工作原理是因为浏览器(我在其中登录了我的Google帐户)在http请求中发送了正确的信息以证明它已被授权。

这个问题在某种程度上与问题How to use Google Apps Script ContentService as a REST server有关,但那里给出的答案正是我不想要的:调用的JSON服务器不应该在我的帐户下运行,而是在调用用户的帐户下使用用户资源(scriptdb,drive,...)。 所以问题是:如何从一个脚本中提供从Google帐户到另一个脚本的信息,以便其他脚本可以在该帐户中运行?我知道使用gas-libraries解决了这个问题,但我希望将它作为JSON客户端/服务器(主要用于解耦依赖关系)。要添加一些代码(以保持Stack Overflow-spirit运行),我的客户端:

var scriptUrl="https://script.google.com/macros/s/paperlapapp1231231/exec";
function callIt (nm, args) {
  var a=[nm];
  for (x in args) {
    a.push(args[x]);
  }
  return Utilities.jsonParse(UrlFetchApp.fetch(scriptUrl+"?args="
       +encodeURIComponent(Utilities.jsonStringify(a))).getContentText());
}
function testFunction (p1, p2, p3) { // this is the proxy
  return callIt ("testFunction", arguments);
}
// Testroutine
function callTest() {
  var r=testFunction (9, "XXXlala", {"dudu":1, "dada":"xxx"});
  Logger.log ("r="+Utilities.jsonStringify(r));
}

我的服务器:

function doGet(request) {
  var ret=null;
  try {
    Logger.log ("I got called with "+JSON.stringify(request));
    var args=JSON.parse(decodeURIComponent (request.parameters.args));
    ret=ContentService.createTextOutput(
            JSON.stringify(this[args.shift()].apply (this, args)))
         .setMimeType(ContentService.MimeType.JSON);
  }
  catch (e) {
    ret=ContentService.createTextOutput(JSON.stringify(e))
          .setMimeType(ContentService.MimeType.JSON);
  }
  return ret;
}
function testFunction (p1, p2, p3) { // this is the implementation
  var s="testing called p1="+p1+", p2="+p2+", p3="+p3;
  Logger.log (s);
  return {testingResult:s};
}

修改

制定了解决方案,但需要Chrome扩展程序和中间代理服务器。请参阅https://bitbucket.org/pbhd/gas-rest-server-as-calling-user

上的代码

1 个答案:

答案 0 :(得分:1)

编辑:以前这是不可能的,正如下面的答案所反映的那样。 但是,Google现在允许这样做,请参阅Execution API https://developers.google.com/apps-script/execution/rest/v1/scripts/run


无法通过Google Apps脚本执行此操作。如果我理解正确,您将使用urlFetch调用另一个Google Apps脚本。

由于Google Apps脚本没有oAuth范围,因此您无法进行经过身份验证的调用。您只能调用以匿名发布的webapp服务,因此将始终在所有者权限下运行。

除非使用用户权限而不是所有者调用初始脚本,否则不能使用库。