【问题标题】:Microsoft Teams bot - link unfurling auth flowMicrosoft Teams 机器人 - 链接展开身份验证流程
【发布时间】:2020-02-26 02:04:10
【问题描述】:

找不到用于链接展开的身份验证流程的良好示例。我设法使用this example 运行 oauth 流。但是在用户提供登录名和密码并且机器人第二次点击OnTeamsAppBasedLinkQueryAsyncGetUserTokenAsync 后仍然返回null。因此,当身份验证流程完成时,我不知道应该从哪里获取令牌。我应该以某种方式坚持下去吗? Teams 是否会在每次请求时向我发送令牌或它应该如何工作?

所以在我的例子中,下面的代码总是返回 null:

var tokenResponse = await (turnContext.Adapter as IUserTokenProvider)
    .GetUserTokenAsync(turnContext, _connectionName, default(string),
        cancellationToken: cancellationToken);

【问题讨论】:

  • 看起来您传递的是 default(string) 而不是“魔术代码”?在您的链接上方几行有一条评论说“当机器人服务身份验证流程完成时,action.State 将包含一个用于验证的魔术代码。”
  • 是的,但是该方法的文档说 magicCode 是可选的:docs.microsoft.com/en-us/dotnet/api/… 我相信代码是用于某种短信确认或类似的东西。无论如何,它在展开流程中不可用,因为 AppBasedLinkQuery 具有单个 Url 属性。
  • 确实如此。对此感到抱歉。
  • 是的,我读了好几遍。问题是我没有对话框,我处于链接展开流程中,所以我没有状态并且无法发送消息。你的意思是我应该检查一些具体的东西吗?

标签: c# botframework microsoft-teams


【解决方案1】:

AppBasedLinkQuery 上似乎没有“状态”字段。当身份验证流程完成时,OnTeamsAppBasedLinkQueryAsync 将再次被调用,turnContext.Activity.Value 将包含 URL 和“状态”(或魔术代码)。我们将把这个字段添加到AppBasedLinkQuery(在这里创建了一个问题:microsoft/botbuilder-dotnet#3429)。

一种解决方法是直接从Activity.Value 中检索状态/魔术代码,例如:

 protected async override Task<MessagingExtensionResponse> OnTeamsAppBasedLinkQueryAsync(ITurnContext<IInvokeActivity> turnContext, AppBasedLinkQuery query, CancellationToken cancellationToken)
        {
            var magicCode = string.Empty;
            var state = (turnContext.Activity.Value as Newtonsoft.Json.Linq.JObject).Value<string>("state");
            if (!string.IsNullOrEmpty(state))
            {
                int parsed = 0;
                if (int.TryParse(state, out parsed))
                {
                    magicCode = parsed.ToString();
                }
            }

            var tokenResponse = await(turnContext.Adapter as IUserTokenProvider).GetUserTokenAsync(turnContext, _connectionName, magicCode, cancellationToken: cancellationToken);
            if (tokenResponse == null || string.IsNullOrEmpty(tokenResponse.Token))
            {
                // There is no token, so the user has not signed in yet.

                // Retrieve the OAuth Sign in Link to use in the MessagingExtensionResult Suggested Actions
                var signInLink = await(turnContext.Adapter as IUserTokenProvider).GetOauthSignInLinkAsync(turnContext, _connectionName, cancellationToken);

                return new MessagingExtensionResponse
                {
                    ComposeExtension = new MessagingExtensionResult
                    {
                        Type = "auth",
                        SuggestedActions = new MessagingExtensionSuggestedAction
                        {
                            Actions = new List<CardAction>
                                {
                                    new CardAction
                                    {
                                        Type = ActionTypes.OpenUrl,
                                        Value = signInLink,
                                        Title = "Bot Service OAuth",
                                    },
                                },
                        },
                    },
                };
            }

            var heroCard = new ThumbnailCard
            {
                Title = "Thumbnail Card",
                Text = query.Url,
                Images = new List<CardImage> { new CardImage("https://raw.githubusercontent.com/microsoft/botframework-sdk/master/icon.png") },
            };

            var attachments = new MessagingExtensionAttachment(HeroCard.ContentType, null, heroCard);
            var result = new MessagingExtensionResult("list", "result", new[] { attachments });

            return new MessagingExtensionResponse(result);
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多