Как добавить токен аутентификации в 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();
}),