From e42b3d7c43e6da622e98c7e3dd8f7014d0a487c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A4=EC=A0=95=EB=AF=BC?= Date: Fri, 15 May 2026 17:33:39 +0900 Subject: [PATCH] fix: route Teams sign-in invokes to OAuth dialog + use UserTokenClient for sign-out --- appPackage/color.png | Bin 0 -> 20852 bytes appPackage/manifest.json | 8 +++---- appPackage/outline.png | Bin 0 -> 3058 bytes src/bot/PlannerBot.ts | 47 ++++++++++++++++++++++++++++++++++----- teams-planner-bot.zip | Bin 0 -> 24232 bytes 5 files changed, 45 insertions(+), 10 deletions(-) create mode 100644 appPackage/color.png create mode 100644 appPackage/outline.png create mode 100644 teams-planner-bot.zip diff --git a/appPackage/color.png b/appPackage/color.png new file mode 100644 index 0000000000000000000000000000000000000000..27d2157c8c21f2e0dc20bc7f09414386d439e7d9 GIT binary patch literal 20852 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 bQO2x9oIS!3PP_tEKnUbTUV)oc3r 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 c-&D*2HFYe5_+;2E^Px# literal 0 HcmV?d00001 diff --git a/src/bot/PlannerBot.ts b/src/bot/PlannerBot.ts index 5750fb2..5b3c076 100644 --- a/src/bot/PlannerBot.ts +++ b/src/bot/PlannerBot.ts @@ -1,17 +1,34 @@ import { - ActivityHandler, CardFactory, + CloudAdapter, ConversationState, StatePropertyAccessor, + TeamsActivityHandler, TurnContext, UserState, } from "botbuilder"; +import { UserTokenClient } from "botframework-connector"; import { OAuthPrompt, DialogSet, DialogTurnStatus, WaterfallDialog } from "botbuilder-dialogs"; import { createGraphClient } from "../graph/graphClientFactory"; import { PlannerClient } from "../graph/plannerClient"; import { LlmClassifier } from "../llm/types"; import { buildResultCard } from "../cards/confirmationCard"; +async function signOutUser(context: TurnContext, connectionName: string): Promise { + const adapter = context.adapter as CloudAdapter; + const userTokenClient = context.turnState.get( + (adapter as unknown as { UserTokenClientKey: symbol }).UserTokenClientKey, + ); + if (!userTokenClient) { + throw new Error("UserTokenClient not available on this adapter"); + } + await userTokenClient.signOutUser( + context.activity.from.id, + connectionName, + context.activity.channelId, + ); +} + const OAUTH_PROMPT = "graphOAuthPrompt"; const MAIN_DIALOG = "mainDialog"; @@ -22,12 +39,13 @@ export interface PlannerBotDeps { connectionName: string; // Azure Bot OAuth connection name } -export class PlannerBot extends ActivityHandler { +export class PlannerBot extends TeamsActivityHandler { private readonly conversationState: ConversationState; private readonly userState: UserState; private readonly classifier: LlmClassifier; private readonly dialogs: DialogSet; private readonly dialogStateAccessor: StatePropertyAccessor; + private readonly connectionName: string; constructor(deps: PlannerBotDeps) { super(); @@ -35,6 +53,7 @@ export class PlannerBot extends ActivityHandler { this.userState = deps.userState; this.classifier = deps.classifier; + this.connectionName = deps.connectionName; this.dialogStateAccessor = this.conversationState.createProperty("DialogState"); this.dialogs = new DialogSet(this.dialogStateAccessor); @@ -67,10 +86,7 @@ export class PlannerBot extends ActivityHandler { const text = (context.activity.text ?? "").trim(); if (text.toLowerCase() === "logout") { - const adapter = context.adapter as unknown as { - signOutUser: (ctx: TurnContext, connName: string) => Promise; - }; - await adapter.signOutUser(context, deps.connectionName); + await signOutUser(context, this.connectionName); await context.sendActivity("로그아웃 완료."); await next(); return; @@ -89,6 +105,15 @@ export class PlannerBot extends ActivityHandler { await next(); }); + // Teams sends an invoke activity ("signin/verifyState" or "signin/tokenExchange") + // after the user completes the OAuth flow. We must route it back into the + // active dialog so OAuthPrompt can finish. + this.onTokenResponseEvent(async (context, next) => { + const dialogContext = await this.dialogs.createContext(context); + await dialogContext.continueDialog(); + await next(); + }); + this.onMembersAdded(async (context, next) => { const greeting = "안녕하세요! 작업 진행 상황을 평소 말로 알려주시면 Planner에 자동으로 정리해 드릴게요.\n" + @@ -108,6 +133,16 @@ export class PlannerBot extends ActivityHandler { await this.userState.saveChanges(context, false); } + protected async handleTeamsSigninVerifyState(context: TurnContext): Promise { + const dialogContext = await this.dialogs.createContext(context); + await dialogContext.continueDialog(); + } + + protected async handleTeamsSigninTokenExchange(context: TurnContext): Promise { + const dialogContext = await this.dialogs.createContext(context); + await dialogContext.continueDialog(); + } + private async handleUtterance( context: TurnContext, token: string, diff --git a/teams-planner-bot.zip b/teams-planner-bot.zip new file mode 100644 index 0000000000000000000000000000000000000000..71a89fc259f9af4c7b9108f4124d043fe75bff81 GIT binary patch literal 24232 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 i^#3x7|BVf`$-Toi0*<6nR literal 0 HcmV?d00001