使用访问令牌调用 Google Apps 脚本网络应用程序

Mar*_*rov 6 web-applications oauth google-apps-script

我需要代表登录到我的系统的用户执行 GAS 服务。所以我有她/他的访问令牌。我希望以某种方式将令牌传输到网络应用程序,而不必再次授权用户将其用于某些活动。这能实现吗?谢谢。

编辑:我认为我没有正确解释我想要完成的任务。这是我尝试实现的工作流程:

  1. 我们授权用户使用 OAuth2 和 Google 访问我们的网站;
  2. 我们获得 Google 返回的她/他的访问令牌;
  3. 有一个 Google Apps 脚本 Web 应用程序,当用户运行该 Web 应用程序时执行;
  4. 我们希望通过提供访问令牌 (2) 来调用此应用程序 (3),以便 Google 不再请求授权;
  5. 实际上,我们想要调用此应用程序 (3),不是通过将用户重定向到它,而是通过将其作为 Web 服务调用。

谢谢

小智 6

马丁的答案最终对我有用,但当我制作原型时遇到了一个主要障碍。

我需要手动添加以下范围,因为 google apps 脚本的“自动范围检测系统”没有要求它:"https://www.googleapis.com/auth/drive.readonly"。这导致UrlFetchApp.fetch总是给 401 提供我不理解的附加信息。记录此附加信息将显示 html,包括以下字符串

Sorry, unable to open the file at this time.</p><p> Please check the address and try again.

我还是不太明白为什么"https://www.googleapis.com/auth/drive.readonly"有必要。这可能与我们可以使用 /dev url 有关,但谁可以使用 /dev url 是通过使用脚本文件的驱动器权限来检查的。

也就是说,以下设置对我有用(它也适用于doGetetc,但我选择了doPost)。我选择在清单文件中明确列出所需的最低范围,但您也可以确保调用脚本将请求以不同方式访问驱动器的权限。我们有两个谷歌应用程序脚本项目,Caller 和 WebApp。

在Caller的manifest文件中,即appsscript.json

{
  ...
  "oauthScopes": 
  [
    "https://www.googleapis.com/auth/drive.readonly",
    "https://www.googleapis.com/auth/script.external_request"]
}
Run Code Online (Sandbox Code Playgroud)

在调用者的Code.gs中

function controlCallSimpleService(){

  var webAppUrl ='https://script.google.com/a/DOMAIN/macros/s/id123123123/exec';

//  var webAppUrl = 
//  'https://script.google.com/a/DOMAIN/macros/s/id1212121212/dev'

  var token = ScriptApp.getOAuthToken();

  var options = {
    'method' : 'post'
    , 'headers': {'Authorization': 'Bearer '+  token}
    , muteHttpExceptions: true
  };

  var response = UrlFetchApp.fetch(webAppUrl, options);
  Logger.log(response.getContentText());
}
Run Code Online (Sandbox Code Playgroud)

在 WebApp 的 Code.gs 中(被调用的 Web 应用程序)

function doPost(event){
  return ContentService.createTextOutput("Hello World");
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*rov 2

我找到了一个方法!只需在请求中包含以下标头:

Authorization: Bearer <user's_access_token>