Teams插件OAuth流程中app.initialize()初始化失败问题排查
Teams应用第三方OAuth认证后SDK初始化问题
我正尝试在Teams应用中实现基于Adobe ID(我网站使用的第三方OAuth提供商)的简易认证功能。遵循Teams官方的应用认证Node.js示例,Adobe ID认证环节一切正常,但进入认证结束页面时,调用await app.initialize();会抛出“SDK initialization timed out.”异常。示例代码里app.initialize()前没有await关键字,这是否有误?如果移除await,后续调用authentication.notifySuccess("Yippee");通知认证成功时,又会抛出“The library has not yet been initialized”异常。
问题:
- 如何解决
app.initialize()无法正常工作的问题? - 示例代码未使用
await为何能正常运行?
认证结束页面的TypeScript代码:
import $ from "jquery"; import {app, authentication} from "@microsoft/teams-js"; startup(); async function startup(){ try{ $("#status").text("Initializing"); await app.initialize(); $("#status").text("Initialized"); console.log("notifying of success"); authentication.notifySuccess("Yippee"); } catch(error){ handleError(error, "initializing"); } } function handleError(error:Error, context: string){ console.error(`💥 Error ${context}: ${error.message}`); $("#status").text(error.message); }
问题1:解决app.initialize()超时的方案
初始化超时主要是页面环境不对或者加载时机有问题,试试这几个操作:
- 等页面完全加载再初始化:把
startup()的调用改成在页面DOM加载完成后执行,避免SDK初始化时页面元素还没就绪:document.addEventListener('DOMContentLoaded', startup); - 确认页面是在Teams iframe里打开:认证结束页面必须是被Teams客户端(包括网页版)的iframe加载的,不能直接在浏览器里打开。Adobe认证跳转回来的URL必须是你Teams应用配置里的合法页面,而且域名要在Teams的白名单里。
- 延长初始化超时时间:给
app.initialize()加个超时参数,把时间调长一点,比如10秒:await app.initialize({ timeout: 10000 }); - 核对SDK版本:你用的
@microsoft/teams-js版本可能和示例不一样,旧版本是回调式API,新版本是Promise式,版本不匹配就容易出问题,尽量和示例用同一个版本。
问题2:示例代码不用await能运行的原因
示例用的大概率是旧版本的Teams SDK,旧版的app.initialize()是回调模式,不用await,初始化完成后会触发传入的回调函数,示例里的认证成功通知逻辑可能是放在这个回调里的,只是写法上没显式写出来。
另外,旧版SDK的authentication.notifySuccess可能会自动等待初始化完成,或者示例代码依赖SDK内部的全局状态,不需要显式等待。但新版本SDK改成了Promise式,必须用await或者.then()确保初始化完成后再调用后续方法,不然就会提示未初始化。
内容的提问来源于stack exchange,提问作者Michael S. Scherotter
相关产品推荐
相关产品推荐

