我正在尝试对我的应用程序进行Google通讯录API身份验证。我已经走过Oauth2流程的第一步,并且拥有授权码。我正在尝试将此代码交换为访问令牌和刷新令牌,但是当我尝试通过
从googleapis.com/oauth2/v4/token获取令牌时响应:“ invalid_grant”“错误请求”错误400。
我的代码
try
{
Map<String,Object> params = new LinkedHashMap<>();
params.put("grant_type","authorization_code");
params.put("code", authCode);
params.put("client_id",CLIENTE_ID);
params.put("client_secret",CLIENTE_ID_SECRETO);
params.put("redirect_uri","http://localhost:8080/conob/api2/contatos/insert");
StringBuilder postData = new StringBuilder();
for(Map.Entry<String,Object> param : params.entrySet())
{
if(postData.length() != 0){
postData.append('&');
}
postData.append(URLEncoder.encode(param.getKey(),"UTF-8"));
postData.append('=');
postData.append(URLEncoder.encode(String.valueOf(param.getValue()),"UTF-8"));
}
byte[] postDataBytes = postData.toString().getBytes("UTF-8");
URL url = new URL("https://www.googleapis.com/oauth2/v4/token");
HttpURLConnection con = (HttpURLConnection)url.openConnection();
con.setRequestMethod("POST");
con.setDoOutput(true);
con.setUseCaches(false);
con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
con.setRequestProperty("charset", "utf-8");
con.setRequestProperty("Content-Length", postData.toString().length() + "");
con.getOutputStream().write(postDataBytes);
BufferedReader reader = null;
try {
reader = new BufferedReader(new InputStreamReader(con.getInputStream()));
StringBuffer buffer = new StringBuffer();
for (String line = reader.readLine(); line != null; line = reader.readLine()){
buffer.append(line);
}
JSONObject json = new JSONObject(buffer.toString());
String accessToken = json.getString("access_token");
return accessToken;
} catch (Exception e) {
reader = new BufferedReader(new InputStreamReader(con.getErrorStream()));
StringBuffer buffer = new StringBuffer();
for (String line = reader.readLine(); line != null; line = reader.readLine()){
buffer.append(line);
}
System.out.println(buffer.toString());
System.out.println(e.toString());
}
}
catch (Exception ex)
{
ex.printStackTrace();
}
return null;
参数输出:
grant_type = authorization_code&code = AUTHORIZATION_CODE&client_id = CLIENTE_ID&client_secret = CLIENTE_SECRET&redirect_uri = http%3A%2F%2Flocalhost%3A8080%2Fconob%2Fapi2%2Fcontatos%2Finsert
我在许多论坛中搜索了许多小时,但并未为我的问题找到解决方案。
基本上,我的应用需要在公司Intranet的google帐户上插入新联系人。
我的问题是答复是“ invalid_grant”?
好的代码,谢谢,从现在开始;
答案 0 :(得分:1)
在OAuth2规范中,"invalid_grant"
类似于与无效/过期/吊销的令牌(授权授予或刷新令牌)相关的所有错误响应的全部内容。
常见原因
除了这些以外,还有许多其他可能导致错误的潜在原因:
端点
我意识到发现文档说googleapis.com/oauth2/v4/token
,但是出于某种原因,尝试使用accounts.google.com/o/oauth2/token
redirect_uri_mismatch
意味着您随请求http://localhost:8080/conob/api2/contatos/insert
发送的重定向uri不是您在Google开发者控制台中添加的重定向uri之一。您需要返回到Google Developer Console并添加此重定向uri。
请注意,您可能要考虑使用google people api,它比以前的google contacts api更容易使用。