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

咨询:如何在启用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 09:02:44