首页 > 解决方案 > 如何在自适应对话框的 HttpRequest 中添加身份验证令牌?

问题描述

我正在使用 Botframework 自适应对话框模板 (c#)。我已经从 HttpRequest 获得了一个令牌并将其保存为会话状态属性conversation.token,现在我正尝试使用此令牌通过 HttpRequest 进行另一个 API 调用。但是从HttpRequest Class的官方文档来看,似乎没有添加身份验证令牌的选项。我尝试在 Headers 中添加令牌,但没有成功,它显示401 Unauthorized错误。自适应对话框中的 HttpRequest 应该如何处理授权?

new HttpRequest()
{
    Url = "http://example.com/json",
    ResultProperty = "conversation.httpResponse",
    Method = HttpRequest.HttpMethod.GET,
    ResponseType = HttpRequest.ResponseTypes.Json,
    Headers = new Dictionary<string, AdaptiveExpressions.Properties.StringExpression>()
    {
        {"Authorization", "Bearer ${conversation.token.content.token}"},
    },
},
new SendActivity("${conversation.httpResponse}"),

标签: c#botframeworkhttprequesthttp-status-code-401adaptive-dialogs

解决方案


我没有使用 HttpRequest,而是使用自定义代码在 CodeAction 中进行 API 调用。首先发出 POST 请求以获取令牌,然后发出 GET 请求以调用主 API。在 GET 请求中,可以这样添加授权:client.DefaultRequestHeaders.Add("Authorization", "Bearer " + accessToken);.

new CodeAction(async (dc, options) =>
{
    var my_jsondata = new
    {
        Username = "username",
        Password = "password"
    };
    var json = JsonConvert.SerializeObject(my_jsondata);
    var data = new StringContent(json, Encoding.UTF8, "application/json");
    var Tokenurl = "https://example.com/token?HTTP/1.1";
    using var Tokenclient = new HttpClient();
    var Tokenresponse = await Tokenclient.PostAsync(Tokenurl, data);
    string Toeknresult = Tokenresponse.Content.ReadAsStringAsync().Result;
    var Tokenjo = JObject.Parse(Tokenresult);
                                
    using var client = new HttpClient();
    var url = "https://example.com/mainapi?HTTP/1.1";
    var accessToken = Tokenjo["token"];
    client.DefaultRequestHeaders.Add("Authorization", "Bearer " + accessToken);
    var response = await client.GetAsync(url);
    string result = response.Content.ReadAsStringAsync().Result;
                               
    dc.State.SetValue("conversation.httpresponse", response);
    dc.State.SetValue("conversation.result", result);

    return await dc.EndDialogAsync();
}),

推荐阅读