如何从Observablehq Notebook连接需身份验证的Google Apps Script Web应用
在Observablehq Notebook中授权访问需身份验证的Google Apps Script Web应用
方案完全可行,以下是具体实现步骤:
1. 配置Google Apps Script(GAS)Web应用部署
- 部署GAS时,将执行应用为设置为「用户访问Web应用时」,确保GAS以当前授权用户的身份运行,而非开发者账号。
- 谁可以访问应用根据需求选择(如「仅限我的组织内的任何人」或「仅限特定用户」),禁止选择匿名访问。
2. 配置关联Google Cloud项目的OAuth同意屏幕
- 打开GAS对应的Cloud项目(通过GAS编辑器「资源」→「云平台项目」进入)。
- 在Cloud Console中配置OAuth同意屏幕:
- 选择应用类型(公开或内部),填写基础信息。
- 添加GAS业务所需的授权范围(例如
https://www.googleapis.com/auth/script.webapp.deploy,按需调整)。 - 将
observablehq.com添加到「授权域」列表,允许跨域授权请求。
3. 创建Google OAuth客户端ID
- 在Cloud Console「API和服务」→「凭据」中,创建「OAuth客户端ID」,应用类型选「Web应用」。
- 添加Observablehq的重定向URI,例如
https://observablehq.com/。 - 记录生成的客户端ID,用于后续Notebook中的授权配置。
4. 在Observablehq Notebook中实现授权逻辑
加载Google gapi库,实现授权弹窗与令牌获取:
// 加载gapi客户端 import { load } from "https://esm.sh/@google/gapi-client"; await load('client:auth2'); // 初始化OAuth客户端 await gapi.client.init({ clientId: '你的OAuth客户端ID', scope: '你配置的授权范围', // 例如"https://www.googleapis.com/auth/script.webapp.deploy" }); // 创建授权交互按钮 viewof authorize = md`**点击授权访问Google服务**`; // 处理授权与请求逻辑 if (authorize) { const authInstance = gapi.auth2.getAuthInstance(); if (!authInstance.isSignedIn.get()) { await authInstance.signIn(); // 弹出Google授权弹窗 } // 获取访问令牌 const accessToken = authInstance.currentUser.get().getAuthResponse().access_token; // 调用GAS Web应用 const response = await fetch('你的GAS Web应用URL', { headers: { 'Authorization': `Bearer ${accessToken}` } }); const result = await response.json(); console.log('GAS返回结果:', result); }
5. 在GAS中验证用户身份
在doGet或doPost函数中验证访问合法性:
function doGet(e) { // 获取当前授权用户 const activeUser = Session.getActiveUser(); if (!activeUser) { return ContentService.createTextOutput(JSON.stringify({error: '未授权访问'})) .setMimeType(ContentService.MimeType.JSON); } // 处理业务逻辑并返回结果 return ContentService.createTextOutput(JSON.stringify({ message: '访问成功', userEmail: activeUser.getEmail() })).setMimeType(ContentService.MimeType.JSON); }
注意事项
- 若OAuth同意屏幕处于测试模式,仅添加的测试用户可完成授权;需发布到生产模式并通过Google审核后,才能向所有用户开放。
- 访问令牌有效期为1小时,可启用离线访问获取刷新令牌以自动续期。
- 修改GAS代码后需重新部署为新版本,确保更新生效。
内容的提问来源于stack exchange,提问作者user9137
相关产品推荐
相关产品推荐

