

























@@ -659,9 +659,11 @@ const BOT_FRAMEWORK_ISSUERS: ReadonlyArray<{
659659];
660660661661type BotFrameworkJwtDeps = {
662-jwt: typeof import("jsonwebtoken");
662+jwt: Pick<typeof import("jsonwebtoken"), "decode" | "verify">;
663663JwksClient: typeof import("jwks-rsa").JwksClient;
664664};
665+type JsonwebtokenRuntime = BotFrameworkJwtDeps["jwt"];
666+type JwksClientCtor = BotFrameworkJwtDeps["JwksClient"];
665667666668const BOT_FRAMEWORK_GLOBAL_AUDIENCE = "https://api.botframework.com";
667669@@ -713,9 +715,55 @@ function hasExpectedBotIdentity(payload: unknown, expectedAppId: string): boolea
713715714716let botFrameworkJwtDepsPromise: Promise<BotFrameworkJwtDeps> | null = null;
715717718+function hasDefaultExport(value: unknown): value is { default?: unknown } {
719+return !!value && typeof value === "object" && "default" in value;
720+}
721+722+function isJsonwebtokenRuntime(value: unknown): value is JsonwebtokenRuntime {
723+return (
724+!!value &&
725+typeof value === "object" &&
726+typeof (value as { decode?: unknown }).decode === "function" &&
727+typeof (value as { verify?: unknown }).verify === "function"
728+);
729+}
730+731+function loadJsonwebtokenRuntime(jwtModule: unknown): JsonwebtokenRuntime {
732+const jwt = hasDefaultExport(jwtModule) ? (jwtModule.default ?? jwtModule) : jwtModule;
733+if (!isJsonwebtokenRuntime(jwt)) {
734+throw new Error("jsonwebtoken did not export decode/verify");
735+}
736+return jwt;
737+}
738+739+function isJwksClientRuntime(value: unknown): value is JwksClientCtor {
740+return typeof value === "function";
741+}
742+743+function loadJwksClientRuntime(jwksModule: unknown): JwksClientCtor {
744+const direct =
745+jwksModule && typeof jwksModule === "object"
746+ ? (jwksModule as { JwksClient?: unknown }).JwksClient
747+ : undefined;
748+const fallback =
749+hasDefaultExport(jwksModule) && jwksModule.default && typeof jwksModule.default === "object"
750+ ? (jwksModule.default as { JwksClient?: unknown }).JwksClient
751+ : undefined;
752+const JwksClient = direct ?? fallback;
753+if (!isJwksClientRuntime(JwksClient)) {
754+throw new Error("jwks-rsa did not export JwksClient");
755+}
756+return JwksClient;
757+}
758+716759async function loadBotFrameworkJwtDeps(): Promise<BotFrameworkJwtDeps> {
717760botFrameworkJwtDepsPromise ??= Promise.all([import("jsonwebtoken"), import("jwks-rsa")]).then(
718-([jwt, { JwksClient }]) => ({ jwt, JwksClient }),
761+([jwtModule, jwksModule]) => {
762+return {
763+jwt: loadJsonwebtokenRuntime(jwtModule),
764+JwksClient: loadJwksClientRuntime(jwksModule),
765+};
766+},
719767);
720768return botFrameworkJwtDepsPromise;
721769}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。