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

在Outlook加载项中结合Office.js使用MSAL.js实现免弹窗身份认证

实现Outlook加载项与独立SPA的无缝微软账号登录方案

核心思路:分环境适配身份验证逻辑

不需要额外第三方库,通过Office.js + MSAL的组合即可实现需求,核心是根据运行环境(独立SPA/Outlook加载项)选择不同的身份验证方式:

1. Outlook加载项环境:直接用Office.js获取令牌

Outlook加载项本身可以通过Office.js的Office.auth.getAccessToken()API,直接基于用户已登录Outlook的会话获取访问令牌,完全不需要弹出登录窗口。

  • 关键参数设置:allowSignInPrompt: false和allowConsentPrompt: false,确保不会触发登录/授权弹窗
  • 示例代码:
// 先确保Office.js初始化完成
Office.initialize = function () {
  // 获取令牌
  Office.auth.getAccessToken({
    allowSignInPrompt: false,
    allowConsentPrompt: false,
    forMSGraphAccess: true // 如果需要调用Microsoft Graph,设置为true
  }).then(accessToken => {
    // 拿到令牌后,直接用于调用API(比如Graph API)
    fetch('https://graph.microsoft.com/v1.0/me', {
      headers: { Authorization: `Bearer ${accessToken}` }
    });
  }).catch(error => {
    // 处理错误,比如用户未登录或权限不足
  });
};

2. 独立SPA环境:继续使用MSAL

独立运行时,保持原有的MSAL登录流程即可,比如用MsalAuthenticationTemplate组件或者手动调用loginPopup/loginRedirect。

3. 适配MSAL缓存,实现跨环境状态统一

如果希望在Outlook加载项环境下也能复用MSAL的令牌管理逻辑(比如后续调用acquireTokenSilent),可以手动将Office.js获取的令牌和用户信息注入MSAL缓存:

  • 步骤1:通过Office.js获取用户信息和令牌
  • 步骤2:构造MSAL要求的AccountInfo和AuthenticationResult对象
  • 步骤3:将对象存入MSAL缓存并设置活跃账户
  • 示例代码(以MSAL v2为例):
async function injectOfficeTokenToMsal(msalInstance) {
  // 获取Office令牌
  const accessToken = await Office.auth.getAccessToken({
    allowSignInPrompt: false,
    allowConsentPrompt: false,
    forMSGraphAccess: true
  });
  // 获取用户信息
  const userProfile = await new Promise((resolve, reject) => {
    Office.context.mailbox.getUserProfileAsync(result => {
      if (result.status === Office.AsyncResultStatus.Succeeded) {
        resolve(result.value);
      } else {
        reject(result.error);
      }
    });
  });
  // 解析令牌获取租户ID等信息(可使用jwt-decode库)
  const decodedToken = jwt_decode(accessToken);
  const tenantId = decodedToken.tid;

  // 构造MSAL账户对象
  const account = {
    homeAccountId: `${userProfile.email}.${tenantId}`,
    environment: "login.microsoftonline.com",
    tenantId: tenantId,
    username: userProfile.email,
    localAccountId: userProfile.email
  };

  // 构造MSAL认证结果
  const authResult = {
    account: account,
    accessToken: accessToken,
    idToken: decodedToken, // 如果需要ID令牌,可通过Office API额外获取或解析
    expiresOn: new Date(decodedToken.exp * 1000),
    scopes: ["User.Read"] // 匹配你的应用权限
  };

  // 存入MSAL缓存
  msalInstance.setActiveAccount(account);
  const cache = msalInstance.getTokenCache();
  await cache.addToken(authResult);
  await cache.addAccount(account);
}

关于第三方库

目前没有专门针对这种场景的开箱即用库,因为Office.js本身已经提供了直接获取令牌的能力,结合MSAL的缓存适配就能满足需求,引入额外库反而会增加不必要的复杂度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 00:58:25