RestSharp - получение токена авторизации из ответа POSTed

Я пытаюсь передать имя пользователя и пароль по следующему URL-адресу:

https://maxcvservices.dnb.com/rest/Authentication

Согласно документации, user_id и пароль должны передаваться как заголовки с ключами: x-dnb-user, x-dnb-pwd соответственно.

До сих пор у меня есть следующий код, который, кажется, работает, но я не могу получить токен аутентификации, возвращенный объектом ответа:

public static void Main (string[] args)
{
    var client = new RestClient ("https://maxcvservices.dnb.com/rest/Authentication");
    var request = new RestRequest (Method.POST);
    request.AddHeader("x-dnb-user", myEmail);
    request.AddHeader("x-dnb-pwd", myPassword);
    IRestResponse resp = client.Execute(request);
    var content = resp.Content;
    Console.WriteLine (resp.StatusDescription);
    Console.WriteLine (resp.StatusCode);
}

Когда я пытаюсь распечатать контент, я получаю пустую строку, но на самом деле я ожидаю токен аутентификации, возвращаемый службой. Я думаю, что я делаю в коде пару вещей (но не уверен), это передает идентификатор пользователя и пароль в качестве заголовков в запросе POST, что и требуется. Токен возвращается как значение поля «Авторизация» в объекте ответа. Мне было интересно, как я могу напечатать токен. Также statusDescription, statusCode печатают OK, что говорит мне, что у меня правильный запрос, но я не могу найти токен аутентификации в ответе. Буду очень признателен за любую помощь, которая поможет мне узнать, как получить доступ к токену аутентификации в поле авторизации возвращенного ответа POST.


person anonuser0428    schedule 17.01.2014    source источник


Ответы (3)


Значит, вы пытаетесь получить значения HttpHeader для Authorization из объекта IRestResponse?

Вы можете использовать, например, используйте для этого LINQ:

var authroizationHeaderFromResponse = resp.Headers.FirstOrDefault(h => h.Name == "Authorization");

            if (authroizationHeaderFromResponse != null)
            {
                Console.WriteLine(authroizationHeaderFromResponse.Value);
            }

Который дает

INVALID CREDENTIALS

Вы предполагаете, что если код состояния ответа - 200 - OK, то его должно сопровождать тело ответа.

В документации конкретно указано, что вы должны ожидать взамен токен в теле ответа?

Разработчики D&B могут отправить 200 - OK ответ без тела ответа, если они хотят, или они могут добавить свой сериализованный токен (JSON, XML и т. Д.) В другое место, например в поле заголовка.

Пример этого можно увидеть в этом коде веб-API ASP.NET, возвращающего ответ от успешного PUT.

if (result.Success)
{
    var dto = Mapper.Map<TEntity, TDto>(result.Data as TEntity);

    var response = Request.CreateResponse(HttpStatusCode.Created, dto);
    var uri = Url.Link("DefaultApi", new {id = dto.Id});
    response.Headers.Location = new Uri(uri);

    return response;
}

Это вернет 200 - OK с сериализованным объектом (result.Data) в теле ответа, но нет ничего плохого в том, что я изменил следующее

var response = Request.CreateResponse(HttpStatusCode.Created, dto);

К чему-то вроде

var response = Request.CreateResponse(HttpStatusCode.Created);

Таким образом, вы все равно получите ответ 200 - OK, но без тела ответа. Это, конечно, противоречит рекомендациям стандарта HTTP / 1.1 для глаголов PUT, но он все равно будет работать.

Я мог бы сделать это даже ради хихиканья

throw new HttpResponseException(HttpStatusCode.Created);

И вы все равно получите ответ 200 - ОК. Немного злобно, но возможно.

Я бы предложил попытаться получить данные из другого ресурса с установленными полями заголовка x-dnb-user и x-dnb-pwd и проверить, возвращается ли затем тело ответа. Возможно, D&B был вдохновлен базовой аутентификацией при реализации этих полей заголовка и поэтому требует, чтобы они присутствовали в каждом запросе?

Стоит попробовать.

Дай мне знать, как это работает.

person Rune Vikestad    schedule 21.01.2014

Посмотрите коллекцию заголовков IRestResponse. Вероятно, он будет там, а не в содержании.

Hth Oli

person Community    schedule 20.01.2014

Может случиться так, что AUTHTOKEN вернется с файлами cookie, поскольку это распространенный подход.

В этом случае вам нужно прикрепить CookieContanier к вашему IRestClient, тогда этот контейнер будет хранить файлы cookie. Если вы используете один и тот же клиент для последующих запросов, этот файл cookie позволит вам войти.

private CookieContainer _cookieJar;

...    

_cookieJar = new CookieContainer();
_client.CookieContainer = _cookieJar;

Затем вы можете осмотреть контейнер после запроса

_client.PostAsync(MyRequest, (r, h) =>
{
   r.Cookies... // inspect em
person leon.io    schedule 27.01.2014