Как добавить токен аутентификации в HttpRequest в адаптивном диалоге?

Я использую адаптивный шаблон диалогового окна Botframework (C#). Я уже получил токен из HttpRequest и сохранил его как свойство состояния разговора.conversation.token, теперь я пытаюсь использовать этот токен, чтобы сделать еще один вызов API с HttpRequest. Но из официального документа HttpRequest Class кажется, что нет возможности добавить токен аутентификации. Я попытался добавить токен в заголовки, но ничего не вышло, показала ошибку 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}"),

1 ответ

Решение

Вместо использования HttpRequest я сделал вызов API внутри CodeAction с пользовательским кодом. Сначала сделайте запрос 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();
}),
Другие вопросы по тегам