咨询:如何在启用Office Scripts的Excel Online工作簿中,将自身Azure AD id_token注入外部Fetch请求以实现身份验证的API调用
在Excel Online的Office Scripts中注入Azure AD id_token到外部API请求
我来帮你搞定这个需求——利用用户当前的Azure AD会话身份,把id_token注入到Office Scripts的外部API请求里,让后端能验证请求来自已认证的内部用户。下面是一步步的实现方案:
一、先搞定API的Azure AD配置
首先你的外部API得在Azure AD里完成注册,确保它能识别来自你组织Excel Online的请求:
- 在Azure AD中注册你的API应用,设置好Application ID URI(这是后续获取令牌的关键资源标识)
- 为Excel Online的服务主体(显示名称一般是
Microsoft Office)添加访问你API的权限,或者直接允许你组织内的用户通过OAuth2.0访问该API - 确认API的验证逻辑能处理Azure AD的id_token,包括签名验证、受众检查、过期时间校验等
二、在Office Scripts中获取并注入令牌
Office Scripts提供了OfficeRuntime.auth.getAccessToken()方法,能直接拿到当前用户的令牌。注意默认是针对Microsoft Graph的,所以要指定你的API资源ID来获取适配的令牌:
async function main(workbook: ExcelScript.Workbook) { // 替换成你注册的API的Application ID URI const targetApiResource = "api://your-api-app-id-uri"; try { // 获取针对目标API的访问令牌(包含用户的id_token声明) const userAccessToken = await OfficeRuntime.auth.getAccessToken({ allowSignInPrompt: true, // 如果用户未登录,触发登录提示 forMSGraphResource: false, // 不是请求Graph的令牌 resource: targetApiResource // 指定你的API资源标识 }); // 发起API请求,把令牌放到Authorization头里 const apiResponse = await fetch("https://your-external-api-url.com/endpoint", { method: "GET", // 根据你的API需求改方法 headers: { "Authorization": `Bearer ${userAccessToken}`, "Content-Type": "application/json" } }); if (!apiResponse.ok) { throw new Error(`API请求失败: ${apiResponse.statusText}`); } // 处理API返回的数据,比如写入Excel const responseData = await apiResponse.json(); const activeSheet = workbook.getActiveWorksheet(); activeSheet.getRange("A1").setValue("API响应结果"); activeSheet.getRange("A2").setValue(JSON.stringify(responseData)); } catch (error) { console.error("操作出错:", error); throw error; } }
三、后端API验证令牌的要点
你的外部API收到令牌后,需要做这些验证来确保身份合法:
- 验证签名:用Azure AD的公钥(可从
https://login.microsoftonline.com/{你的租户ID}/discovery/v2.0/keys获取)验证令牌签名的有效性 - 检查受众(
aud声明):必须和你API的Application ID URI完全匹配 - 检查颁发者(
iss声明):确认是你组织的Azure AD实例(格式一般是https://login.microsoftonline.com/{租户ID}/v2.0) - 检查过期时间(
exp声明):确保令牌还在有效期内 - 可选校验租户ID(
tid声明):只允许你组织的租户用户访问
几个关键注意事项
- 权限问题:要确保用户在Azure AD里被授予了访问你API的权限,不然
getAccessToken()会抛出权限不足的错误 - 资源标识准确性:
resource参数必须和你API注册时的Application ID URI完全一致,否则令牌无法被API验证 - 用户交互:
allowSignInPrompt: true会在用户未登录时弹出登录框,确保用户完成认证流程 - 错误处理:一定要捕获令牌获取失败、API请求失败等异常,避免脚本直接崩溃
内容的提问来源于stack exchange,提问作者baouss
相关产品推荐
相关产品推荐

