Как я должен располагать в порядке запрос HttpWebRequest, чтобы заверять меня с OAuth 2?

Я должен тратить Веб услугу rest с удостоверением Oauth2, чего у меня есть документация (верительные грамоты), но не, как делание запроса token, для которого я думаю, что я должен делать запрос http, я продолжаю тематику этого вопроса, я использую следующий код

var request = (HttpWebRequest)WebRequest.Create("http://sitio/webservices/auth/token/");

var postData = "grant_type=grant_type&username=username&password=password&id=id&secret=secret";

//    request.Headers.Add("id", "id");
//    request.Headers.Add("secret", "secret");

var data = Encoding.ASCII.GetBytes(postData);

request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = data.Length;

    using (var stream = request.GetRequestStream())
    {
        stream.Write(data, 0, data.Length);
    }
var response = (HttpWebResponse)request.GetResponse();

var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();

Но у меня есть два пунктуальных вопроса о нем и я надеюсь, что они могут помогать мне.

  1. Изменчивый постскриптум содержит данные, которых нужно посылать, не, если он был должен посылать их так или скорее добавлять их как Headers, как это показывает код, который документировался, или если я должен посылать переменные в форме изменчивого постскриптума и другие в форме headers, varibles, которые у меня есть, - верительные грамоты доступов, одни, которые идентифицирует приложение, потому что это услуга REST или же один grand_type, пойдите и secret и остальные переменные - удостоверение профиля пользователя.

  2. Второй вопрос состоит на ContentType, в том, что тип должен быть, я хочу получить json или текст, обобщая: Если я хочу получить Json в ответе, я должен посылать Json?

Я надеюсь быть просветом, большое спасибо.

0
задан 13.04.2017, 16:00
2 ответа

spec OAuth 2 определяет, что Content-Type твоего request должен быть application/x-www-form-urlencoded в случае, что информация об удостоверении находилась в body. В твоем случае ты делаешь POST а следовательно ты должен использовать этот Content-Type, чтобы соглашаться с estándard.

Также определи, что параметр body grant_type будь должен соответствовать в соответствии с разгрузкой, выбранной с:

  1. authorization_code: В случае, что ты использовал Ауторисатион Коде Гранта
  2. password: В случае, что ты использовал Ресоурсе Овнер Пассворд Кредентиальс Грант
  3. client_credentials: В случае, что ты использовал Кльент Кредентиальс Гранта

Из-за кода, который ты помещаешь, я представляю, что ты используешь Ресоурсе Овнер.

Есть маленькая деталь в твоем вопросе и состоит в том, что ты используешь id и secret и это не часть estándard. Ты был бы должен использовать client_id и client_secret как способ идентификации

Клиент МОЖЕТ использовать параметр просьбы "client_id", чтобы идентифицироваться сам с собой, когда он посылает просьбы endpoint token.

Эти данные посланы в body вместе с остальными данными об удостоверении. Твой код был бы должен оставаться таким.

// Estos valores los obtienes usando input del usuario
var username = "john";
var password = "pass";

// Estos valores debes conocerlos de antemano para autenticar tu cliente
var clientId = "23343";
var clientSecret = "kjdhf343242j342";

var request = (HttpWebRequest)WebRequest.Create("http://sitio/webservices/auth/token/");

var postData = "grant_type=password&username=" + username + "&password=" + password + "&client_id=" + clientId + "&client_secret=" + clientSecret;

var data = Encoding.ASCII.GetBytes(postData);

request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded;charset=utf8";
request.ContentLength = data.Length;

using (var stream = request.GetRequestStream())
{
    stream.Write(data, 0, data.Length);
}
var response = (HttpWebResponse)request.GetResponse();

var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();

Обновление

Отвечая на твою секунду, чтобы говорить ему в сервер то, что ты хочешь получить дебет использовать header Accept. Content-Type твоего request не влияет на то, что server пошлет тебе. Этот header - это, чтобы определять формат того, что ты посылаешь ему, и он смог интерпретировать это правильно.

Content-Type

Намерение header Content-Type состоит в том, чтобы описывать данные, содержавшие в теле достаточное для того, чтобы принимающий агент смог выбирать механизм или реактив, приспособленный, чтобы представлять данные пользователю

Accept

header Accept просьбы может быть использованным, чтобы определять какие-то типы данных или типы средств, которые считаются приемлемыми для ответа

С этим header ты можешь определять его в сервер, в котором формат ты хочешь получить ответ.

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

https://developer.mozilla.org / en-US / docs / Веб / HTTP / Content_negotiation

http://www.newmediacampaigns.com/blog/browser-rest-http-accept-headers

2
ответ дан 24.11.2019, 14:42
  • 1
    мне нравится этот ответ, только, в который я верю, что текст transcripto Content-Type и Accept быть должным и # 237; чтобы быть в espa и # 241; ol. – rnrneverdies 22.03.2016, 17:08
  • 2
    Очень верный. Немедленно я это издаю. В любом случае уже hab и # 237; во включая соединение в первоначальный doc. – devconcept 22.03.2016, 17:12

Если ты призываешь услугу REST, он советовал бы, что ты оценил использовать класс HttpClient с этим, будет более легко призывать услугу используя глаголы http

Обтаин Беарер Token using HttpClient

Logging into WebAPI 2 сайт from c # desktop application

в примере важная часть

HttpClient client = new HttpClient();
client.BaseAddress = new Uri(siteUrl);
client.DefaultRequestHeaders.Accept.Clear();

 HttpContent requestContent = new StringContent("grant_type=password&username=" + Username + "&password=" + Password, Encoding.UTF8, "application/x-www-form-urlencoded");

 HttpResponseMessage responseMessage = await client.PostAsync("Token", requestContent);

краев, которые определяют в header grant_type, это важно. В твоем примере я вижу, что ты определяешь grant_type=grant_type, там ты не определяешь ни одного. Ты будешь получать от ответа json, который ты будешь должен parsear, чтобы получать стоимость token

0
ответ дан 24.11.2019, 14:42