401 (Неавторизованный) при попытке доступа к REST API

В общем, я пытаюсь подключиться к REST API онлайн. Достаточно легко, верно?

Однако я получаю сообщение об ошибке 401 (Unauthorized) всякий раз, когда пытаюсь подключиться. Я использую консольное приложение С#, чтобы проверить это, и я также пытался использовать PUTMAN (приложение Google Chrome для просмотра HTTP-запросов).

Вот ссылка на API, который я использую: https://community.dynatrace.com/community/display/APMSAASDOC/Login+-+REST+API

Я выполняю все перечисленные шаги. Я знаю, что мое имя пользователя и пароль верны (зашел на портал Dynatrace). У кого-нибудь есть идеи, что может быть не так? Вот мой код ниже (я удалил фактическое имя пользователя и пароль по понятным причинам):

static async Task RunAsync()
    {
        string _user;
        string _password;
        string _authorizationType;
        string _contentType;
        string _CredentialsToBase64;
        string _url = "https://datafeed-api.dynatrace.com";

        _user = "MYUSERNAME";
        _password = "MYPASSWORD";
        _authorizationType = "basic";
        _contentType = "application/json";
        _CredentialsToBase64 = System.Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes(_user + ":" + _password));


        using (var client = new HttpClient())
        {
            client.BaseAddress = new Uri(_url);
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(_contentType));
            client.DefaultRequestHeaders.Add("Authorization", _authorizationType + " " + _CredentialsToBase64);

            using (HttpResponseMessage httpResponse = await client.GetAsync("publicapi/rest/v1.0/login?user=MYUSERNAME&password=MYPASSWORD HTTP/1.1"))
            {
                if (httpResponse.IsSuccessStatusCode)
                {
                    Console.WriteLine("Success");
                }
                else
                {
                    Console.WriteLine(string.Format("Service request failed ({0})", httpResponse.StatusCode));
                }
            }



        }

person tnort173    schedule 30.06.2015    source источник
comment
Если вы передаете заголовок авторизации, почему вы включаете имя пользователя/пароль в URL-адрес.   -  person Justin Pearce    schedule 01.07.2015
comment
Почему вы вообще передаете заголовок Authorization?   -  person n0rd    schedule 01.07.2015
comment
Я получил этот код от другого члена команды; Я попытался прокомментировать заголовок авторизации, и, думаю, это не имеет значения.   -  person tnort173    schedule 01.07.2015


Ответы (3)


Строка HTTP/1.1 в конце вызова метода client.GetAsync, вероятно, переводится в password=MYPASSWORD%20HTTP/1.1 (или аналогичный), что приводит к ошибке. Попробуйте удалить это и посмотрите, работает ли это.

Примечание. %20 – это пробел в кодировке URL.

Другой вариант Ответ на этот пост может быть Связанный. Подводя итог, можно сказать, что для форматирования запроса требуется, чтобы BaseAddress имел косую черту в конце, а строка GetAsync не начиналась с косой черты.

person Brad Berger    schedule 30.06.2015
comment
К сожалению, это не сработало :/ Раньше я думал, что проблема может быть и в этом, но это не имеет значения. - person tnort173; 01.07.2015

Простите всех за головную боль. Проблема заключалась в проблеме с аккаунтом в самой компании. Я связался с ними, и они заметили, что проблема связана с переносом учетных записей со старого на новый портал. Так что ничего страшного в нашем конце не было. Спасибо за вашу помощь всем!

person tnort173    schedule 01.07.2015

Удалите «HTTP/1.1» в конце вашего URL-адреса GET, он будет добавлен в конец вашего пароля, следовательно, 401

person BhavO    schedule 30.06.2015