gpt4 book ai didi

java - 来自授权码交换的 invalid_grant 响应

转载 作者:行者123 更新时间:2023-11-30 10:09:46 27 4
gpt4 key购买 nike

我正在尝试向 Google 联系人 API 验证我的应用程序。我已经完成了 Oauth2 流程的第一步并获得了授权码。我正在尝试将此代码交换为访问 token 和刷新 token ,但是当我尝试从 googleapis.com/oauth2/v4/token 获取 token 时,接收到

response : "invalid_grant" "Bad request" Error 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

我在许多论坛上搜索了很多小时,但没有得出解决我的问题的方法。

基本上,我的应用需要在公司内联网的谷歌账户上插入新联系人。

我的问题是“invalid_grant”的响应是什么?

好的代码,从现在开始感谢;

最佳答案

OAuth2 spec,“invalid_grant” 是一种包罗万象的所有与无效/过期/撤销 token (授权授权或刷新 token )相关的错误响应。

常见原因

  1. 用户已主动撤销对我们应用的访问权限
  2. 用户已重置/恢复其 Google 密码2015 年 12 月,Google 更改了他们的默认行为,以便非 Google Apps 用户的密码重置将自动撤销所有用户的应用程序刷新 token 。并非所有 api 联系人都是如此,但我想我还是会注意到这一点。

除此之外,还有许多其他可能引发错误的潜在原因:

  1. 服务器时钟/时间不同步
  2. 无权离线访问
  3. 受谷歌限制
  4. 使用过期的刷新 token
  5. 使用过期的授权码。
  6. 用户已停止 Activity 6 个月
  7. 不正确或无效的刷新 token
  8. 使用 service worker 邮箱代替客户端 ID
  9. 短时间内访问 token 过多
  10. 客户端 SDK 可能已过时

端点

我意识到发现文档说 googleapis.com/oauth2/v4/token 但由于某种原因,这个终点并不总是有效尝试使用 accounts.google.com/o/oauth2/ token

redirect_uri_mismatch

表示您随请求发送的重定向 uri http://localhost:8080/conob/api2/contatos/insert 不是您在 Google 开发者控制台中添加的重定向 uri .您需要返回到 Google 开发人员控制台并添加此重定向 uri。

请注意,您可能需要考虑使用 google people api,它比旧的 google contacts api 更容易使用。

关于java - 来自授权码交换的 invalid_grant 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53083821/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com