我已经阅读了许多帖子,所有我能找到的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和/或用访问和刷新令牌交换授权代码?
谢谢你的帮助。
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?