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 (잘못된 요청)에 대한 이유는 당신이 HTTP 본문에 쿼리 매개 변수로 보낼 데 필요한 HTTP 요청 헤더와 같은 code, client_id, client_secret, grant_typeredirect_uri을 보내는 믿습니다 POST 요청 (Google OAuth2InstalledApp docs에 따라).

HTTP POST를 보내는 좋은 예를 보려면 Using java.net.URLConnection to fire and handle HTTP requests을보십시오. 당신은 등 code, client_id을 타고 몸에 쿼리 문자열로 작성해야합니다 : 구글 OAuth2를 문서에서

// 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")); 

, 샘플 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 속성 만 쿼리 문자열에서 참조해야합니까? 또는 거기에 content-type도 설정해야합니까? – JPCF

+1

쿼리 문자열 매개 변수 만. Content-Type은 HTTP 헤더로 설정되어야합니다. Google 문서에서 샘플 HTTP POST를 표시하도록 답변을 업데이트했습니다. –

+0

고마워요! 나는 soooo 피로했다! – JPCF