Google的oauth端点正在返回“错误请求”...但为什么?

时间:2013-10-28 00:51:14

标签: java oauth oauth-2.0 httpsurlconnection

经过大量时间浪费谷歌搜索“错误请求”的可能原因'在https://accounts.google.com/o/oauth2/token申请令牌时,我决定问为什么这段代码除了“错误的请求”之外什么也得不到。来自服务器的响应......

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),因为服务器返回了与内容长度相关的错误。

有什么想法吗? 是否有必要将有效载荷放在一条线上?怎么样?

1 个答案:

答案 0 :(得分:3)

我认为HTTP 400(错误请求)的原因是您要发送codeclient_idclient_secretgrant_typeredirect_uri作为HTTP请求标头,您需要将它们作为HTTP POST请求正文中的查询参数发送(根据Google OAuth2InstalledApp docs)。

查看Using java.net.URLConnection to fire and handle HTTP requests以获取有关如何发送HTTP POST的一个很好的示例。您需要使用codeclient_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