2014-01-17 3 views
3

Я пытаюсь передать имя пользователя и пароль к следующему URL-адрес:RestSharp - Получение токена авторизации от посланного ответа

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.

ответ

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 и т. Д.) В другом месте, например. в поле заголовка.

Пример этого можно увидеть в этом коде из Web 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 - КИ с сериализованным объектом (result.Data) в теле ответа, но нет ничего плохого со мной изменяя следующие

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

Чтобы что-то вроде

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

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

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

throw new HttpResponseException(HttpStatusCode.Created); 

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

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

Это стоит попробовать.

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

1

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

Hth Oli

0

Возможно, AUTHTOKEN возвращается с куки-файлами, так как это общий подход.

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

private CookieContainer _cookieJar; 

...  

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

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

_client.PostAsync(MyRequest, (r, h) => 
{ 
    r.Cookies... // inspect em 
Смежные вопросы