如何通过Office.js获取Outlook登录用户的UPN(用户主体名称)
获取Outlook登录用户的UPN(用户主体名称) via Office.js
当然可以获取!你遇到的问题大概率是没正确解析getUserIdentityTokenAsync返回的令牌,或者权限配置不到位。下面给你两种可靠的解决方案:
方法1:解析用户身份令牌(JWT)
getUserIdentityTokenAsync返回的是一个JWT格式的身份令牌,里面就包含了UPN字段,只是需要你手动解码令牌的payload部分。
步骤:
- 确保你的Outlook插件manifest文件中配置了足够的权限,比如:
<Permissions>ReadWriteMailbox</Permissions> - 使用以下代码获取并解析令牌:
Office.context.mailbox.getUserIdentityTokenAsync(function(result) { if (result.status === Office.AsyncResultStatus.Succeeded) { const idToken = result.value; // 拆分JWT的三个部分,取中间的payload段解码 const payloadBase64 = idToken.split('.')[1]; // 处理Base64的URL安全编码问题 const decodedPayload = decodeURIComponent(atob(payloadBase64).split('').map(c => { return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2); }).join('')); const userInfo = JSON.parse(decodedPayload); const userUPN = userInfo.upn; console.log('用户UPN:', userUPN); } else { console.error('获取身份令牌失败:', result.error.message); } });
方法2:调用Microsoft Graph API
如果需要更全面的用户信息,也可以用getCallbackTokenAsync获取访问令牌,然后调用Graph的/me端点,其中userPrincipalName字段就是你要的UPN。
代码示例:
Office.context.mailbox.getCallbackTokenAsync({ isRest: true }, function(result) { if (result.status === Office.AsyncResultStatus.Succeeded) { const accessToken = result.value; fetch('https://graph.microsoft.com/v1.0/me', { headers: { 'Authorization': `Bearer ${accessToken}` } }) .then(res => res.json()) .then(userData => { const userUPN = userData.userPrincipalName; console.log('用户UPN:', userUPN); }) .catch(err => console.error('调用Graph API失败:', err)); } else { console.error('获取回调令牌失败:', result.error.message); } });
注意事项:
- 这种方法需要在manifest中配置
WebApplicationInfo,关联你的Azure AD应用,并申请User.Read权限。 - 确保你的插件有权限调用Graph API。
关于userProfile的补充
你提到只能通过userProfile获取邮箱,确实在部分环境或权限较低的情况下,userProfile不会返回UPN字段,这时候上面两种方法就更可靠。
内容的提问来源于stack exchange,提问作者Deepak Sharma
相关产品推荐
相关产品推荐

