Google Apps Script Web App设为域内访问时,如何验证用户域身份?
问题描述
将doPost(或doGet)函数部署为Web App时,有以下「访问权限」选项:
- 仅我自己
- 我的域名(MY-DOMAIN)内任何人
- 拥有Google账户的任何人
- 任何人
当选择「我的域名内任何人」时,如何让doPost函数识别访问用户属于该域?出于安全考虑,希望使用该选项而非「任何人」。
我的尝试步骤
- 在独立脚本中编写doPost函数:
function doPost(e) { const json = JSON.parse(e.postData.contents); const text = json.text; return ContentService.createTextOutput(`The text you sent is "${text}"`); }
- 部署脚本并复制Web App的URL。
- 编写另一个独立脚本访问上述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()是否适用。
- 使用域内账户执行
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
相关产品推荐
相关产品推荐

