Как правильно настроить аутентификацию для использования внешнего Restful Apis в ASP.NET Core 2.0? - PullRequest
0 голосов
/ 15 января 2019

Я потребляю внешний Restful Api. Я указал ключ авторизации для значения заголовков. Когда я пытаюсь отправить запрос почтальоном, он возвращает 200 Ok. Я использую API-ключ в коде. Как правильно использовать Restful Api с ключом авторизации?

Я уже настраиваю Startup.cs для ConfigureServices и Configure. Затем я использую HttpClient для потребления Restful Api. Каким-то образом я получаю 401 Несанкционированный ответ.

Код для Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddCors(options =>
    {
        options.AddPolicy("CorsPolicy", builder =>
        {
            builder
                .AllowAnyOrigin()
                .AllowAnyMethod()
                .AllowAnyHeader()
                .AllowCredentials();
        });
    });

    services.AddAuthentication();
    services.AddMvc();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{       
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseAuthentication();
    app.UseCors("CorsPolicy");
    app.UseMvc();
}  

Код для Services.cs:

private static HttpClient _httpClient = new HttpClient();

public CRUDService()
{
    _httpClient.BaseAddress = new Uri("https://api.deezer.com");

    _httpClient.DefaultRequestHeaders.Clear();
    _httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("X-API_KEY", "081f0fca-1bca-4e8e-9a24-22ff2c3d462c");

    _httpClient.Timeout = new TimeSpan(0, 0, 30);
    _httpClient.DefaultRequestHeaders.Clear();
    _httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
}

public async Task Run()
{
    await GetResource();
}

public async Task GetResource()
{
    var response = await _httpClient.GetAsync("/v1/song/latest");
    response.EnsureSuccessStatusCode();

    var content = await response.Content.ReadAsStringAsync();
    var movies = new List<Movie>();

    if (response.Content.Headers.ContentType.MediaType == "application/json")
    {
        movies = JsonConvert.DeserializeObject<List<Movie>>(content);
    }
}

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Я не уверен, что это сработает, но не похоже, что вы создаете / инициализируете CRUDService - вам может потребоваться сделать что-то вроде этого:

public async Task GetResource()
{
    CRUDService(); // <<<<---- this was added <<<<----
    var response = await _httpClient.GetAsync("/v1/song/latest");
    response.EnsureSuccessStatusCode();

    var content = await response.Content.ReadAsStringAsync();
    var movies = new List<Movie>();

    if (response.Content.Headers.ContentType.MediaType == "application/json")
    {
        movies = JsonConvert.DeserializeObject<List<Movie>>(content);
    }
}
0 голосов
/ 15 января 2019

Я получаю 600 неверных запросов по этому API, поэтому я не могу подтвердить. Но я думаю, вам нужно добавить ключ API следующим образом:

_httpClient.DefaultRequestHeaders.Add("X-API_KEY", "081f0fca-1bca-4e8e-9a24-22ff2c3d462c");

... вместо добавления его в DefaultRequestHeaders.Authorization.

Пол

...