You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google Apps Script Web App设为域内访问时,如何验证用户域身份?

问题描述

将doPost(或doGet)函数部署为Web App时,有以下「访问权限」选项:

  • 仅我自己
  • 我的域名(MY-DOMAIN)内任何人
  • 拥有Google账户的任何人
  • 任何人

当选择「我的域名内任何人」时,如何让doPost函数识别访问用户属于该域?出于安全考虑,希望使用该选项而非「任何人」。

我的尝试步骤

  1. 在独立脚本中编写doPost函数:
function doPost(e) {
  const json = JSON.parse(e.postData.contents);
  const text = json.text;
  return ContentService.createTextOutput(`The text you sent is "${text}"`);
}
  1. 部署脚本并复制Web App的URL。
  2. 编写另一个独立脚本访问上述doPost函数:
function myFunction() {
  const app_url = "-----------步骤2中复制的URL-------------";
  
  const data = {'text': "Hogehoge" };

  const params = {
    'method': 'post',
    'headers': { 'Authorization': 'Bearer ' + ScriptApp.getIdentityToken()},
    "ContentType": "application/json",
    'payload' : JSON.stringify(data),
    'muteHttpExceptions': true
  }
  
  const resp = UrlFetchApp.fetch(app_url, params);

  // 预期输出 'The text you sent is "Hogehoge"' 
  console.log(resp.getContentText());
}

为获取identityToken,已在appscript.json中添加https://www.googleapis.com/auth/userinfo.email权限,我认为请求头应包含执行myFunction的账户信息,但不确定ScriptApp.getIdentityToken()是否适用。

  1. 使用域内账户执行myFunction(),返回以下内容:
<HTML>
<HEAD>
<TITLE>Unauthorized</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF" TEXT="#000000">
<H1>Unauthorized</H1>
<H2>Error 401</H2>
</BODY>
</HTML>

解决方法

1. 正确获取身份令牌并指定受众

ScriptApp.getIdentityToken()必须传入Web App的URL作为受众(audience),否则生成的令牌无法被Web App验证。修改myFunction中的令牌获取逻辑:

// 替换为你的Web App完整URL
const audience = "https://script.google.com/macros/s/你的Web App部署ID/exec";
const token = ScriptApp.getIdentityToken(audience);

同时修正请求头的Content-Type拼写错误(原代码写的是ContentType):

'headers': { 
  'Authorization': 'Bearer ' + token,
  'Content-Type': 'application/json'
}

2. 在Web App中验证用户域名

更新doPost函数,通过用户邮箱验证其所属域名:

function doPost(e) {
  // 获取当前访问用户的邮箱
  const userEmail = Session.getActiveUser().getEmail();
  // 替换为你的目标域名
  const allowedDomain = "your-domain.com";

  // 验证用户是否属于指定域名
  if (!userEmail || !userEmail.endsWith(`@${allowedDomain}`)) {
    return ContentService.createTextOutput("无访问权限").setStatusCode(403);
  }

  // 处理正常请求
  const json = JSON.parse(e.postData.contents);
  const text = json.text;
  return ContentService.createTextOutput(`你发送的文本是:"${text}"`);
}

3. 部署Web App的关键设置

部署Web App时需确保:

  • 执行权限选择「以用户身份运行(访问Web App的用户)」
  • 谁拥有访问权限选择「MY-DOMAIN内任何人」
  • 代码修改后必须重新部署为新版本,否则更新不生效

4. 完整的请求脚本示例

修改后的myFunction:

function myFunction() {
  const app_url = "https://script.google.com/macros/s/你的Web App部署ID/exec";
  const audience = app_url; // 受众必须与Web App URL一致
  
  const data = {'text': "Hogehoge" };
  const token = ScriptApp.getIdentityToken(audience);

  const params = {
    'method': 'post',
    'headers': { 
      'Authorization': 'Bearer ' + token,
      'Content-Type': 'application/json'
    },
    'payload' : JSON.stringify(data),
    'muteHttpExceptions': true
  }
  
  const resp = UrlFetchApp.fetch(app_url, params);
  console.log(resp.getContentText());
}

内容的提问来源于stack exchange,提问作者user16784320

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 00:42:51