2013-09-26 1 views
2

Я пытаюсь позвонить в службу аутентификации OAuth2 Google, согласно этим инструкциям: https://developers.google.com/accounts/docs/OAuth2ForDevicesWebRequest: Строка запроса данных против х-WWW-форм-urlencoded содержание

Я положил все необходимые параметры в строку запроса и послал запрос. Это сработало для раздела «Получение кода пользователя», но не для раздела «Получение токенов доступа и обновления».

После многократного поиска и получения ошибок 400 ошибок, я обнаружил, что вместо того, чтобы помещать данные в строку запроса, вы можете создать запрос с помощью FormUrlEncodedContent и отправить данные через контент с помощью приложения \ x-www -форма-urlencoded Content-Type.

Вот код перед:

var requestMessage = new HttpRequestMessage(); 
requestMessage.Method = "POST"; 
requestMessage.RequestUri = new Uri(fullUrl); 

Где fullUrl это что-то вроде:

https://accounts.google.com/o/oauth2/device/code?client_id=812741506391-h38jh0j4fv0ce1krdkiq0hfvt6n5amrf.apps.googleusercontent.com&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile 

И новый код:

var requestMessage = new HttpRequestMessage(); 
requestMessage.Method = "POST"; 
requestMessage.RequestUri = new Uri(url); 
requestMessage.Content = new FormUrlEncodedContent(CreateDictionary(queryStringNames, queryStringValues)); 

Где Ссылка:

https://accounts.google.com/o/oauth2/device/code 

и queryStringNames и queryStringValues ​​- это строковые массивы имен и значений требуемых параметров.

В чем разница между этими двумя методами? Можно ли предположить, что все вызовы POST могут использовать запросы кодированного содержимого URL вместо того, чтобы помещать данные в строку запроса?

ответ

4

В общем случае запросы POST не нуждаются в строке запроса, но все еще подвержены логической реализации сервера. В случае OAuth, который является довольно известным стандартом, и они соответствуют хорошей практике, безопасно использовать данные, закодированные в форме, если не указано явно в API для отправки Parameter в качестве строки запроса.

Строка запроса & Почтовые данные представляют собой два разных набора параметров. Если сервер ожидает строку запроса, вы должны отправить строку запроса только. Все зависит от того, как реализована логика на стороне сервера. Вы не можете использовать их в качестве альтернативы. В большинстве документов API четко указано, чего они ожидают.