当前位置: 首页 > 知识库问答 >
问题:

来自授权代码交换的invalid_grant响应

鲁羽
2023-03-14

我正在尝试通过Google contacts API验证我的应用程序。我已经完成了Oauth2流程的第一步,并获得了一个授权代码。我正试图将此代码交换为访问令牌和刷新令牌,但当我试图从googleapis.com/oauth2/v4/token receive

响应:“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;

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

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

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

共有1个答案

林德辉
2023-03-14

在OAuth2规范中,“invalid_grant”是与无效/过期/撤销令牌(身份验证授予或刷新令牌)相关的所有错误响应的总括。

    null

endpoint

redirect_uri_mismatch

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

 类似资料:
  • 我在StackOverflow上看到过几个关于这个的问题,但没有一个对我有帮助。我不能过去的'invalid_grant'错误时,试图做授权代码授予我的1管理员用户在DocuSignSandbox环境。 我有一个用户,他是仪表板中的DS管理员。我创建了一个新的应用程序,并获得了集成商密钥/客户端id和密钥 使用指南,https://developers.docusign.com/esign-res

  • 我想更好地理解隐式授权流和授权代码授权流之间的区别,因为我不确定我目前的理解是否正确。 隐式授权流主要由前端应用程序用于验证用户身份吗? 隐式授权流是否只需要一个client_id、用户名和密码来进行身份验证,换句话说,永远不会发送client_secret? 授权码只是一个短期令牌吗? 将授权码交换为访问令牌后,客户端可以访问用户帐户多长时间?具体地说,如果客户端是一个长时间运行的脚本,那么用户

  • 我试图复制cognito hosted ui sign in页面(https://docs.aws.amazon.com/cognito/latest/developerguide/login-endpoint.html)的功能,但是aws sdk没有提供任何获取用户名、密码并返回授权代码的方法,这些代码可用于获取Access/ID令牌。initiateAuth和adminInitiateAuth

  • 我正在创建一个小的YouTube Analytics API脚本,我一直在尝试用用户授权码交换访问令牌。 我已经设法获得了授权令牌,但是我不知道如何“向Google提交POST请求”。 我认为这是可行的: 但我不知道在条件之间放什么才能真正交换代码。当我访问该位置时 https://accounts.google.com/o/oauth2/code={代码} 我得到一个未知的URL。

  • 接口说明 获取授权代码 如需调用,请访问 开发者文档 来查看详细的接口使用说明 该接口仅开放给已获取SDK的开发者 API地址 GET /wish3dearth/api/access/v1.0.0/getHardWareCode 是否需要登录 否 请求字段说明 无 响应字段说明 无 响应成功示例 { "code": 0, "data": "134305892", "message":

  • 接口说明 获取授权代码 如需调用,请访问 开发者文档 来查看详细的接口使用说明 该接口仅开放给已获取SDK的开发者 如开启https功能,请求地址的协议应改为https,如:https://www.example.com/wish3dearth/api/access/v1.0.0/getLicenseInfo API地址 GET /wish3dearth/api/access/v1.0.0/get