使用OAuthCard调用turnContext.SendActivityAsync后获取用户令牌

问题描述 投票:0回答:1

我正在使用以下代码尝试在我的团队应用程序中获取用户令牌,配置了 SSO 并授予了管理员授权,因此用户看不到任何提示。调用此代码时:

protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
{
    var userTokenClient = turnContext.TurnState.Get<UserTokenClient>();
    var prompt = Activity.CreateMessageActivity();
    var tokenResponse = await userTokenClient.GetUserTokenAsync(turnContext.Activity.From.Id, _connectionName, turnContext.Activity.ChannelId, null, cancellationToken).ConfigureAwait(false);

    if (turnContext.Activity.Text.Equals("logout"))
    {
        await userTokenClient.SignOutUserAsync(turnContext.Activity.From.Id, _connectionName, turnContext.Activity.ChannelId, cancellationToken: cancellationToken);
        await turnContext.SendActivityAsync(MessageFactory.Text("You have been signed out."), cancellationToken);
        return;
    }

    if (tokenResponse == null)
    {
        var signInResource = await userTokenClient.GetSignInResourceAsync(_connectionName, (turnContext.Activity as Activity), "", cancellationToken).ConfigureAwait(false);
        var value = signInResource.SignInLink;
        prompt.Attachments.Add(new Attachment
        {
            ContentType = OAuthCard.ContentType,
            Content = new OAuthCard
            {
                Text = "Test2",
                ConnectionName = _connectionName,
                Buttons = new[]
                {
                    new CardAction
                    {
                        Title = "Test3",
                        Text = "Test1",
                        Type = ActionTypes.Signin,
                        Value = value
                    },
                },
                TokenExchangeResource = signInResource.TokenExchangeResource,
                TokenPostResource = signInResource.TokenPostResource
            },
        });

        await turnContext.SendActivityAsync(prompt, cancellationToken).ConfigureAwait(false);
        var hebbenwetokenhier = await userTokenClient.GetUserTokenAsync(turnContext.Activity.From.Id, _connectionName, turnContext.Activity.ChannelId, null, cancellationToken).ConfigureAwait(false);
        // This stays null
        return;
    }
    // Other code here that uses the userToken
}

在变量

hebbenwetokenhier
中,我想获取用户令牌,因为用户没有看到任何提示,我不需要使用另一个提示吗?我能否确保收到OAuthCard发送结果后再次调用OnMessageActivity?或者是否有另一种方法可以在不使用对话框的情况下执行此操作。

当我运行此代码时,第一次输入

tokenResponse == null
检查,但运行 OAuthCard 一次后,用户已通过身份验证,我从第 5 行得到结果,现在我只想这样做,这样用户就不会必须发送两条消息!

botframework microsoft-teams
1个回答
0
投票

您可以使用 OnInvokeActivityAsync 方法从 Teams 客户端接收调用活动。当用户与 OAuthCard 交互并完成令牌交换过程时调用此方法。然后您可以通过该方法获取用户令牌。

protected override async Task<InvokeResponse> OnInvokeActivityAsync(ITurnContext<IInvokeActivity> turnContext, CancellationToken cancellationToken)
{
    JObject value = JsonConvert.DeserializeObject<JObject>(turnContext.Activity.Value.ToString());
    JObject authentication = null;
    if (value["authentication"] != null)
    {
        authentication = JsonConvert.DeserializeObject<JObject>(value["authentication"].ToString());
        var userTokenClient = turnContext.TurnState.Get<UserTokenClient>();
        var tokenResponse = await userTokenClient.GetUserTokenAsync(turnContext.Activity.From.Id, _connectionName, turnContext.Activity.ChannelId, null, cancellationToken).ConfigureAwait(false);
        if (tokenResponse != null)
        {
            // Use the user token here
        }
    }
    return null;
}

OnInvokeActivityAsync 方法被重写以处理调用活动。身份验证对象是从活动值中提取的。如果认证对象不为空,则表示用户已经与OAuthCard进行了交互,并且完成了令牌交换过程。然后调用 GetUserTokenAsync 方法来获取用户令牌。

© www.soinside.com 2019 - 2024. All rights reserved.