Как для проверки подлинности API для инсталляции остальных клиентов
Я создал интерфейс для вызова API Prestashop с помощью Refit, для приложения-бота, которое я разрабатываю. Чтобы вызвать API, вам нужно пройти аутентификацию с помощью ключа API Prestashop, который у меня есть. Для запроса с помощью браузера мне нужно только вызвать url-адрес с этим форматом:
$"https://{ApiKey}@{mypage}.com/api"
И он аутентифицируется с помощью ключа Api, указанного перед знаком@
. Для определения Refit HttpClient
я использую этот код в запуске.CS:
// This is the ApiUrl from the appsettings.json file
var apiUrl = Configuration.GetSection("PrestashopSettings").GetSection("ApiUrl").Value;
// We add the Api and specify the de/serialization will be XML
services.AddRefitClient<IPrestashopApi>(
new RefitSettings
{
ContentSerializer = new XmlContentSerializer()
})
.ConfigureHttpClient(c => c.BaseAddress = new System.Uri(apiUrl));
Затем я ввожу API в один из своих классов и вызываю одну из его функций. URL-адрес кажется правильным, если я вставляю полный URL-адрес (базовый + URL-адрес [Get]) в браузер, он возвращает XML правильно. Но когда я делаю это из приложения он возвращает исключение:
Microsoft.Bot.Builder.Integration.AspNet.Core.BotFrameworkHttpAdapter:Error: Exception caught : Refit.ApiException: Response status code does not indicate success: 401 (Unauthorized).
at Refit.RequestBuilderImplementation.<>c__DisplayClass14_0`2.<<BuildCancellableTaskFuncForMethod>b__0>d.MoveNext() in D:\a\1\s\Refit\RequestBuilderImplementation.cs:line 274
--- End of stack trace from previous location where exception was thrown ---
Каков правильный способ аутентификации с помощью HttpClient Refit? Я делаю что-то не так?
ОБНОВЛЕНИЕ:
Поэтому я попробовал это:
public class HttpAuthentication : HttpClientHandler
{
private readonly string Token;
public HttpAuthentication(string token)
{
Token = token ?? throw new ArgumentException(nameof(token));
}
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
var token = Token;
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
return await base.SendAsync(request, cancellationToken).ConfigureAwait(false);
}
}
И этот код в моем Startup.cs
:
var apiKey = Configuration.GetSection("PrestashopSettings").GetSection("ApiKey").Value;
var storeUrl = Configuration.GetSection("PrestashopSettings").GetSection("StoreUrl").Value;
// We add the Api and specify the de/serialization will be XML, and we specify the Authentication Client.
services.AddRefitClient<IPrestashopApi>(
new RefitSettings
{
ContentSerializer = new XmlContentSerializer()
})
.ConfigureHttpClient((c) => c.BaseAddress = new System.Uri(storeUrl))
.ConfigureHttpMessageHandlerBuilder((c) => new HttpAuthentication(apiKey));
И я все еще получаю то же сообщение об ошибке.
Ответы - Как для проверки подлинности API для инсталляции остальных клиентов / How to authenticate Prestashop API REST Client

20.11.2019 02:20:12
создайте такой класс :
public class AuthenticatedHttp : HttpClientHandler
{
private readonly string Token;
public AuthenticatedHttp(string token)
{
if (token == null)
{
throw new ArgumentNullException(nameof(token));
}
this.Token = token;
}
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
// See if the request has an authorize header
var token = this.Token;
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
return await base.SendAsync(request, cancellationToken).ConfigureAwait(false);
}
}
и отправить токен в этот класс:
var token = await GetAccessToken();
var RestReq = RestService.For<IPerson>(new HttpClient(new AuthenticatedHttp(token)) { BaseAddress = new Uri(Url) });

token
должен быть ключом Api, а значение заголовка, которое вы назначили "носителю", - это идентификатор, который может быть любым значением? Или это должно быть что-то особенное? Тогда мне нужно создать атрибут [Header()] в классе api или что-то еще?





21.11.2019 04:36:03
Ладно я понял это в конце. Прежде всего, я хочу отметить, что есть два решения вокруг этого.
Первое Решение
Вы можете фактически аутентифицироваться, используя свой ключ API в качестве параметра запроса, его ключ-ws_key
, поэтому вы можете отправить такой вызов:
"https://api.yourapiaddress.com/yourentity?ws_key={API KEY HERE}"
Второе решение
Это тот, который я выбрал, просто добавив параметр заголовка. Выяснилось, что Prestashop API 1.7 использует базовую авторизацию с ключом API в качестве имени пользователя и пустого пароля, поэтому я построил заголовок, подобный этому, при Startup.cs
:
// Encode your Api Key
String encoded = Convert.ToBase64String(System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(apiKey));
// Add the API to DI in Dialog classes
services.AddRefitClient<IPrestashopApi>(
new RefitSettings
{
ContentSerializer = new XmlContentSerializer()
})
.ConfigureHttpClient((c) => c.BaseAddress = new Uri(storeUrl))
.ConfigureHttpClient((c) => c.DefaultRequestHeaders.Add("Authorization", "Basic " + encoded));
Я использовал функцию ConfigureHttpClient Retrofit, но вы могли бы добиться того же, создав свой собственный объект HttpClient и настроив DefaultRequestHeaders следующим образом.