Почему я получаю ответ 403 при использовании Brightspace API? - PullRequest
0 голосов
/ 11 марта 2020

Я пытаюсь использовать Brightspace API , но я получаю ответ 403 (Запрещено).

Я зарегистрировал свое приложение с помощью Manage Extensability (/ d2l На странице / lp / extensibility / home) я сгенерировал идентификатор пользователя и ключ из API Test Tool .

Используя все это, я установил пакет NuGet D2L.Extensibility.AuthSdk в свой проект. Затем в соответствующем классе я создал свойство для UserContext и инициализирую его в конструкторе следующим образом:

_d2LUserContext = new D2LAppContextFactory()
    .Create(OrionConfiguration.D2LApplicationId, OrionConfiguration.D2LApiKey)
    .CreateUserContext(
        "censored user id",
        "censored user key",
        new HostSpec("https", OrionConfiguration.D2LUrl.Substring(8), 443)
    );

Примечания:

  1. .Substring(8) Это связано с тем, что D2LUrl включает в себя схему URL
  2. Идентификатор и ключ пользователя были сгенерированы этим утром, поэтому срок их действия еще не истек

Затем я пытаюсь вызвать API. Код для этого разделен на несколько методов.

private string AuthParam(string path, string method)
{
    return _d2LUserContext
        .CreateAuthenticatedTokens($"/d2l/api/lp/1.2{path}", method)
        .Select(tuple => $"{tuple.Item1}={tuple.Item2}")
        .Aggregate((acc, p) => $"{acc}&{p}");
}

public Task<UserResponse> CreateUser(UserRequest userRequest)
{
    const string path = "/users";
    return _httpUtils.Post<UserResponse>($"{path}/?{AuthParam(path, "POST")}", userRequest);
}

UserRequest - это версия POC # O (Plain Old C# Object) модель, которую API ожидает .

Вот соответствующий метод в классе HttpUtils - это обертка вокруг HttpClient, который я написал, чтобы избавиться от некоторых шаблонов в других классах.

internal async Task<T> Post<T>(string route, dynamic body)
{
    var response = await _httpClient.PostAsync(
        _baseUrl + route, 
        new StringContent(JsonConvert.SerializeObject(body), Encoding.UTF8, "application/json")
    );

    _logger.LogInformation($"POST request to {route}");
    _logger.LogInformation(await response.Content.ReadAsStringAsync());
    return JsonConvert.DeserializeObject<T>(await response.Content.ReadAsStringAsync());
}

Теперь, собрав все вместе, когда я пытаюсь отладить вызов этих методов, я устанавливаю точку останова на строке после моего запроса POST, и мы видим, что я получаю 403 403 error in debugger

Мне интересно, почему это происходит. Пользователь, из которого были сгенерированы ключ и идентификатор, является супер-администратором, поэтому это не проблема с разрешениями.

1 Ответ

1 голос
/ 24 марта 2020

Фактический рассматриваемый маршрут API имеет конечный sla sh, а конечный sla sh, таким образом, нуждается в использовании метода, который генерирует маркер / подпись аутентификации. Мне кажется, что вы делаете, передавая path, у которого нет этого завершающего sla sh, и затем помещаете его в запрос как побочный эффект, когда вы нажимаете на параметры запроса, так что вы ' сгенерировать подпись аутентификации для одного маршрута API, а затем использовать другой в вызове.

Маршруты API Brightspace довольно чувствительны к этому завершающему sla sh, и, к сожалению, они не всегда корректно или последовательно применяются в маршрутах. .

...