Outlook 外接程序中存储 access token 的合适位置是什么?
结论
你列出的方案中,Office.context.roamingSettings是唯一安全合规的可选存储方案,其余方案均存在适配问题或安全风险,具体分析如下:
各方案评估
1. Office.js 内置接口类
该接口存储的配置绑定到当前打开的文档/邮件项,仅当前文档可访问,无法全局存储用户级的token;如果是共享文档,token还会随着文件同步泄露给其他有权限访问文档的用户,完全不适用。Office.context.document.settings.set()
这是微软官方为Office外接程序设计的用户级配置存储方案:Office.context.roamingSettings✅ 推荐- 数据和当前用户的微软账户绑定,仅当前用户、当前外接程序有权限读取
- 存储内容经过微软服务器加密,支持跨设备漫游同步,不会随Outlook缓存清理、设备更换丢失
- 不属于文档/邮件的元数据,不会随着文件共享泄露
使用时注意,调用set()后需要执行saveAsync()才能完成持久化:
const _settings = Office.context.roamingSettings _settings.set("access-token", "***"); _settings.saveAsync((asyncResult) => { // 确认保存结果 });
该接口存储的属性绑定到单个邮件项,仅打开对应邮件时才能读取,无法全局存储用户的通用token,完全不适用。Office.context.mailbox.item.loadCustomPropertiesAsync()
2. JavaScript 原生方法类
明文存储在当前运行环境的本地缓存中,极易被恶意程序、XSS攻击窃取;且不同运行环境(桌面端Outlook、网页版Outlook、移动端Outlook)的localStorage完全隔离,无法跨端同步,清理缓存、重装软件后数据就会丢失,不符合安全合规要求。localStorage.setItem()
存在和localStorage相同的明文存储、易被窃取、易丢失、跨端不通的问题,同时Office外接程序的沙箱环境对cookie的生命周期限制极多,经常会被自动清理,不推荐使用。document.cookie
补充注意事项
- 存储refresh token时无需额外加密,
roamingSettings的底层存储已经做了数据加密处理 - 建议尽量缩短access token的有效时长,过期后及时调用refresh token换取新凭证,不要长期存储超期的token
- 不要将任何敏感凭证存储在和文档、邮件绑定的属性中,避免随文件共享泄露
内容的提问来源于stack exchange,提问作者wkwk
相关产品推荐
相关产品推荐

