使用此代码将来自云端硬盘界面的请求的初始代码与可用于发出 API 请求的令牌交换。
public GoogleCredential exchangeCode(String authorizationCode) throws CodeExchangeException {
try {
GoogleTokenResponse response = new GoogleAuthorizationCodeTokenRequest(new NetHttpTransport(), new JacksonFactory(), CLIENT_ID, CLIENT_SECRET, authorizationCode, REDIRECT_URI).execute();
return new GoogleCredential.Builder().setClientSecrets(CLIENT_ID, CLIENT_SECRET).setTransport(new NetHttpTransport()).setJsonFactory(new JacksonFactory()).build().setFromTokenResponse(response);
}
catch (Exception e) {
log.error("An error occurred: " + e);
throw new CodeExchangeException(null);
}
}
在大多数情况下它可以工作,但是在某些情况下(可能是 5%),我得到
An error occurred: com.google.api.client.auth.oauth2.TokenResponseException: 500 Error processing OAuth 2 request
<HTML>
<HEAD>
<TITLE>Error processing OAuth 2 request</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF" TEXT="#000000">
<H1>Error processing OAuth 2 request</H1>
<H2>Error 500</H2>
</BODY>
</HTML>
可能是什么问题?
我得到"500 个内部服务器错误"到大约 0.5% 的 API 调用。我有一个重试机制,在第二次尝试时似乎总是成功。
function doSomething(req) {
.
.
.
.
restRequest.execute(function(resp) {
var myResp = new Object();
try {
if (resp.error) {
if (resp.error.code == "401") {
do401(function() {
doSomething(req);
}, req, myResp);
return;
}
if (resp.error.code == "403") {
cl("403 no auth " + resp.error.message);
return;
}
if (resp.error.code == "500") {
cl("server error 500, retrying " + resp.error.message);
exponentialBackoff();
doSomething(req);
return;
}
}
} catch (ex) {
cl("[fg62] exception " + ex);
}
这是由于在授权过程中(OAuth 2.0 服务器端流的身份验证代码交换)期间我们的 2 个内部服务器之间的超时引起的。我们在OAuth 2.0 Playground上也遇到了同样的问题。现在,谷歌的身份验证团队应该已经解决了这个问题。如果您再次遇到此问题,请告诉我们。
重试机制通常有助于解决您从云端硬盘 API 收到的暂时性 503 错误。但在这种情况下(来自 Auth 服务器的 500 个错误)它没有帮助,因为同一服务器配置中的相同用户(即远程地理区域中的用户和服务器)每次都会超时。