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

使用在 Java 中发布的授权令牌从谷歌获取刷新令牌

田成化
2023-03-14

我已经阅读了许多帖子,所有我能找到的Google文档,并尝试了以下的许多迭代,但仍然无法获得访问和刷新令牌。我确实获得了授权代码,但似乎无法获得该代码来交易访问和刷新令牌。

            if(authCode == null || authCode.equals("")) {
            String url = "https://accounts.google.com/o/oauth2/v2/auth?"
                    + "scope=https://mail.google.com/&"
                    + "response_type=code&"
                    + "redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&"
                    + "client_id=" + clientId +
                    "&access_type=offline";
            URI uri = new URI(url);
            logger.debug("URI for auth is: "  + uri);
            
            if (Desktop.isDesktopSupported() && Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)) {
                Desktop.getDesktop().browse(uri);
            }
        }
        
        else {
            logger.debug("Refreshing");
            initRefreshToken();
        }

这样,我就可以在我的属性中剪切并粘贴一个访问代码(只是测试并尝试让它先工作)来获得刷新和访问令牌。

在initRefreshToken()方法中,源代码如下:

        if(refreshToken.equals("")) {
        logger.debug("Getting refresh token");
        HttpPost post = new HttpPost("https://oauth2.googleapis.com/token");

        // add request parameter, form parameters
        List<NameValuePair> urlParameters = new ArrayList<>();
        urlParameters.add(new BasicNameValuePair("code", authCode));
        urlParameters.add(new BasicNameValuePair("client_id", clientId));
        urlParameters.add(new BasicNameValuePair("client_secret", clientSecret));
        urlParameters.add(new BasicNameValuePair("redirect_uri", "http://localhost:8000/"));
        urlParameters.add(new BasicNameValuePair("grant_type", "authorization_code"));

        try {
             post.setEntity(new UrlEncodedFormEntity(urlParameters));
             
             System.out.println("***** URL: " + urlParameters);
             CloseableHttpClient httpClient = HttpClients.createDefault();
             CloseableHttpResponse response = httpClient.execute(post);

            System.out.println(EntityUtils.toString(response.getEntity()));
        
        }

如果这是第二次或以后使用该代码,将打印以下内容:

推荐令牌: ***** URL:[code=4/1AY0e-g…,client_id=370…i1h2u1s.apps.googleusercontent.com,client_secret=bAOH…,redirect_uri=https://localhost:8000/,grant_type=authorization_code]

{ "error": "invalid_grant "," error_description ":"错误的请求" }

如果运行该代码,并且是第一次使用身份验证代码,它将打印:

{"错误":"redirect_uri_mismatch","error_description":"错误请求"}

我在谷歌控制台上看到,本地主机域有例外,所以没有必要注册它们。然而,如果有必要注册它们,它不会让你注册它们,因为一个域名必须是你拥有的顶级域名才能注册。因此,如何在Java中注册localhost和/或用访问和刷新令牌交换授权代码?

谢谢你的帮助。

共有1个答案

越开畅
2023-03-14

DaImTo提供了一个关于此的很棒的视频,在该视频和与其相关的博客帖子中,redirect_uri正确地列为:“urn:ietf:wg:oauth:2.0:oob”。我在文档中没有找到这一点,但当我将其添加到源代码中时,我得到了访问和刷新令牌作为响应。非常感谢你的帮助,DaImTo。

 类似资料:
  • 调用execute方法时,它会引发以下异常: 谁能指出我哪里做错了?我能够从谷歌oAuth UI获得访问令牌。

  • 在我的Java/Ionic2应用程序中,我通过REST服务请求使用刷新令牌对Google Drive进行身份验证,然后使用access_type=offline,如下所述:https://developers.Google.com/identity/protocols/oauth2webserver#refresh。 服务器响应200 OK,所以它给我一个刷新和一个访问令牌,只是在我第一次请求访问

  • 我正试图在他过期后获得一个新的访问令牌。我已将收到的信息保存在银行中,作为第一次客户访问的回报: {"access_token":"TOKEN","refresh_token":"TOKEN","token_type","承载","expires_in": 3600,"创建": 1320790426} 令牌到期后,我需要申请一个新的令牌,我这样做: 问题是总是返回以下错误:刷新OAuth2令牌时出

  • 我使用python google api客户机库来处理它使用google的Platform.js库从前端获得的的。 在这一点上,我所拥有的只是一个承载令牌。如何将其转换为凭据以便访问驱动器API?