2013-10-28 2 views
1

После того, как вы потратили много времени на поиски возможных причин «плохого запроса» при запросе на токен в https://accounts.google.com/o/oauth2/token, я решил спросить, почему этот код не может получить ничего, кроме ответа «плохого запроса» с сервера. ..Конечная точка Google oauth возвращает «плохой запрос» ... но почему?

String url = "https://accounts.google.com/o/oauth2/token"; 
HttpsURLConnection con = (HttpsURLConnection) obj.openConnection(); 
con.setChunkedStreamingMode(0); 
con.setRequestMethod("POST"); 
con.setRequestProperty("Host", "accounts.google.com"); 
con.setRequestProperty("Content-Type", 
     "application/x-www-form-urlencoded"); 
con.setRequestProperty("code", authCode); 
con.setRequestProperty("client_id", 
     "[CLIENT_ID]"); 
con.setRequestProperty("client_secret", "[CLIENT_SECRET"); 
con.setRequestProperty("redirect_uri", 
     "http://localhost:8080/login"); 
con.setRequestProperty("grant_type", "authorization_code"); 

// Send post request 
con.setDoOutput(true); 

Я должен установить con.setChunkedStreamingMode(0), поскольку сервер возвращал ошибку, связанную с длиной содержимого.

Любые идеи? Может ли понадобиться разместить полезную нагрузку в одной строке? как?

ответ

3

Я считаю, что причина для HTTP 400 (Bad Request) это вы отправляете code, client_id, client_secret, grant_type и redirect_uri как запрос HTTP заголовков, где необходимо отправить их в качестве параметров запроса в теле HTTP POST запрос (согласно Google OAuth2InstalledApp docs).

Посмотрите на Using java.net.URLConnection to fire and handle HTTP requests для хорошего примера отправки HTTP POST. Вы должны будете принять code, client_id и т.д., и записать их в виде строки запроса в теле:

// partial example only: only code and client_id are included 
String query = String.format("code=%s&client_id=%s", code, client_id); 
OutputStream out = con.getOutputStream(); 
out.write(query.getBytes("UTF-8")); 

Из документации Google oauth2 запрос на образец HTTP POST может выглядеть примерно так:

POST /o/oauth2/token HTTP/1.1 
Host: accounts.google.com 
Content-Type: application/x-www-form-urlencoded 

code=4/v6xr77ewYqhvHSyW6UJ1w7jKwAzu& 
client_id=8819981768.apps.googleusercontent.com& 
client_secret={client_secret}& 
redirect_uri=https://oauth2-login-demo.appspot.com/code& 
grant_type=authorization_code 
+0

Я думаю, что вы правы. Умм у меня есть другой вопрос ... на эту строку запроса нужно ссылаться только на конкретные свойства oauth? или я должен установить там тип контента? – JPCF

+1

Только параметры строки запроса. Content-Type должен быть настроен как HTTP-заголовок. Я обновил свой ответ, чтобы показать образец HTTP POST из документации Google. –

+0

Спасибо, человек! Я был ослеплен! – JPCF

Смежные вопросы