Как для проверки подлинности API для инсталляции остальных клиентов

Как для проверки подлинности API для инсталляции остальных клиентов

20.11.2019 01:43:46 Просмотров 55 Источник

Я создал интерфейс для вызова 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

Milad kamari

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) });
https://stackoverflow.com/questions/58952427/how-to-authenticate-prestashop-api-rest-client/58953138#comment104162678_58953138
Я предполагаю, что tokenдолжен быть ключом Api, а значение заголовка, которое вы назначили "носителю", - это идентификатор, который может быть любым значением? Или это должно быть что-то особенное? Тогда мне нужно создать атрибут [Header()] в классе api или что-то еще?
https://stackoverflow.com/questions/58952427/how-to-authenticate-prestashop-api-rest-client/58953138#comment104163505_58953138
Первый шаг вы отправляете запрос rest в auth api и получаете токен . затем используйте приведенный выше код.
https://stackoverflow.com/questions/58952427/how-to-authenticate-prestashop-api-rest-client/58953138#comment104164998_58953138
Не могли бы вы ответить, где в коде я должен использовать свой ключ Api? Я должен использовать его для доступа к Api, и я не вижу его нигде объясненным.
https://stackoverflow.com/questions/58952427/how-to-authenticate-prestashop-api-rest-client/58953138#comment104165928_58953138
вы должны установить ключ Api для запроса заголовка . как этот httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue ("предъявитель", "ваш токен Oauth"), но поскольку вы можете использовать refit выше кода, решите свою проблему
https://stackoverflow.com/questions/58952427/how-to-authenticate-prestashop-api-rest-client/58953138#comment104166327_58953138
Спасибо за ваш asnwer я обновил сообщение после попытки вашего решения, все еще имея ту же проблему.
Является ответом!
Ferran Capallera Guirado

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 следующим образом.

Помочь в развитии проекта:
Закрыть X