来自交换授权码的invalid_grant响应

时间:2018-10-31 12:53:21

标签: java google-api google-oauth google-oauth2 google-contacts

我正在尝试对我的应用程序进行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”?

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

1 个答案:

答案 0 :(得分:1)

OAuth2规范中,"invalid_grant"类似于与无效/过期/吊销的令牌(授权授予或刷新令牌)相关的所有错误响应的全部内容。

常见原因

  1. 用户已积极撤消对我们应用的访问权限
  2. 用户已重置/恢复了自己的Google密码 2015年12月,Google更改了默认行为,以便为非Google Apps用户重置密码会自动撤消所有用户的应用刷新令牌。不是所有的api联系人都不是其中之一,但是我想我还是会注意的。

除了这些以外,还有许多其他可能导致错误的潜在原因:

  1. 服务器时钟/时间不同步
  2. 未获得离线访问权限
  3. 被Google扼杀
  4. 使用过期的刷新令牌
  5. 使用过期的授权码。
  6. 用户已停用6个月
  7. 刷新令牌无效或无效
  8. 使用服务人员电子邮件代替客户端ID
  9. 短时间内访问令牌太多
  10. 客户端SDK可能已过时

端点

我意识到发现文档说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更容易使用。