OAuthCard не возвращает токен после входа в систему - PullRequest
0 голосов
/ 10 июня 2019

Я создаю бота команд. Я добавил активность входа в свой бот команд.

Когда я пытаюсь войти, появляется всплывающее окно для входа, и после завершения входа токен не возвращается. Поэтому «WaitForToken» никогда не вызывается.

Мне удалось войти в систему с помощью того же бота на прошлой неделе. Может ли кто-нибудь помочь мне понять о последних изменениях в OAuthCard для ботов?

Код для входа следующий:

private async Task SendOAuthCardAsync(IDialogContext context, Activity activity)
        {
            var reply = await context.Activity.CreateOAuthReplyAsync(ApplicationSettings.ConnectionName,
                "Please sign in to continue.", "Sign In", true).ConfigureAwait(false);
            await context.PostAsync(reply);

            context.Wait(WaitForToken);
        }

 private async Task WaitForToken(IDialogContext context, IAwaitable<object> result)
        {
            var activity = await result as Activity;

            var tokenResponse = activity.ReadTokenResponseContent();
            var channelData = context.Activity.GetChannelData<TeamsChannelData>();
            if (tokenResponse != null)
            {
                // Use the token to do exciting things!
                await context.PostAsync($"Your sign in is successful");
            }
            else
            {
                string input = activity.Type == ActivityTypes.Message ? Microsoft.Bot.Connector.Teams.ActivityExtensions.GetTextWithoutMentions(activity)
                                                                : ((dynamic)(activity.Value)).state.ToString();
                if (!string.IsNullOrEmpty(input))
                {
                    tokenResponse = await context.GetUserTokenAsync(ApplicationSettings.ConnectionName, input.Trim());
                    if (tokenResponse != null)
                    {
                        // Use the token to do exciting things!

                        await context.PostAsync($"Your sign in is successful");
                        return;
                    }
                }
                await context.PostAsync($"Hmm. Something went wrong.");
            }
        }

1 Ответ

0 голосов
/ 11 июня 2019

Это, вероятно, связано с этой проблемой .

Использовали ли вы промежуточное программное обеспечение для того, чтобы оно работало изначально?Промежуточное программное обеспечение будет выглядеть примерно так:

// hook up onSend pipeline
turnContext.OnSendActivities(async (ctx, activities, nextSend) =>
{
    foreach (var activity in activities)
    {
        if (activity.ChannelId != "msteams") continue;
        if (activity.Attachments == null) continue;
        if (!activity.Attachments.Any()) continue;
        if (activity.Attachments[0].ContentType != "application/vnd.microsoft.card.signin") continue;
        if (!(activity.Attachments[0].Content is SigninCard card)) continue;
        if (!(card.Buttons is CardAction[] buttons)) continue;
        if (!buttons.Any()) continue;

        // Modify button type to openUrl as signIn is not working in teams
        buttons[0].Type = ActionTypes.OpenUrl;
    }

    // run full pipeline
    return await nextSend().ConfigureAwait(false);
});

Недавно было обновление, которое сделало его таким, что вам больше не нужно промежуточное программное обеспечение.Вместо этого выполните следующие действия:

  1. Удалите промежуточное ПО из своего бота (если оно у вас есть)
  2. Создайте своего бота в команде в редакторе манифестов App Studio
  3. В разделеДомены и разрешения, убедитесь, что token.botframework.com был добавлен в качестве действительного домена.
  4. Нажмите «Установить» и начните общаться с вашим ботом

В качестве альтернативы, я считаю, что вы можете просто обновить все ваши пакеты до 4.4 и добавить это в начало вашей OnTurnAsync():

if (turnContext?.Activity?.Type == ActivityTypes.Invoke && turnContext.Activity.ChannelId == "msteams")
    await Dialog.Run(turnContext, ConversationState.CreateProperty<DialogState>(nameof(DialogState)), cancellationToken);
else
    await base.OnTurnAsync(turnContext, cancellationToken);

Если это не сработает, вы можете попробовать использовать это:

protected override async Task OnUnrecognizedActivityTypeAsync(ITurnContext turnContext, CancellationToken cancellationToken)
{
    if (turnContext?.Activity.Type == ActivityTypes.Invoke)
    {
        await turnContext.SendActivityAsync(
        new Activity()
        {
            Type = ActivityTypesEx.InvokeResponse,
            Value = null
        });
        await Dialog.Run(turnContext, ConversationState.CreateProperty<DialogState>(nameof(DialogState)), cancellationToken);
    }
}

Промежуточное программное обеспечение сделало так, чтобы карты в командах использовали Action.OpenUrl (который больше не работает) вместо Action.Signin (это то, что использует любой другой канал).

...