使用刷新令牌访问 Google 驱动器 API,无浏览器,401 错误
Access Google Drive API with refresh token, no browser, 401 error
我正在尝试使用从 OAuth Playground 发出的刷新令牌访问 GoogleDrive API(我自己的 a/c),如下所示。我正在使用我的刷新令牌和访问令牌进行离线访问,但我收到 401 未经授权。我的代码基于参考 belwoand google-api javadocs recommendation for building an offline request
我不想使用浏览器,我希望运行从服务器端应用程序上传到我自己的 a/c。
ref:
代码:
public static void main(String[] args) throws IOException {
HttpTransport TRANSPORT = new NetHttpTransport();
JsonFactory JSON_FACTORY = new JacksonFactory();
String refreshTokenString="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; //from console
String accessTokenString ="yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"; //from console
GoogleCredential credential = createCredentialWithRefreshToken(
TRANSPORT, JSON_FACTORY, new TokenResponse().setRefreshToken(refreshTokenString));
credential.setAccessToken("accessTokenString");
//exeucute HTTP request for offline accessTokenString
// Execute HTTP GET request to revoke current token.
HttpResponse response = TRANSPORT.createRequestFactory()
.buildGetRequest(new GenericUrl(
String.format(
"https://www.googleapis.com/drive/v2/changes",
credential.getAccessToken()))).execute();
System.out.println("RESPONSE: " +response);
}
public static GoogleCredential createCredentialWithRefreshToken(HttpTransport transport,
JsonFactory jsonFactory, TokenResponse tokenResponse) {
HttpTransport TRANSPORT = new NetHttpTransport();
JsonFactory JSON_FACTORY = new JacksonFactory();
return new GoogleCredential.Builder().setTransport(transport)
.setJsonFactory(JSON_FACTORY)
.setClientSecrets(CLIENT_ID, CLIENT_SECRET)
.build()
.setFromTokenResponse(tokenResponse);
}
错误:
{
"error": {
"errors": [
{
"domain": "global",
"reason": "required",
"message": "Login Required",
"locationType": "header",
"location": "Authorization"
}
],
"code": 401,
"message": "Login Required"
}
}
我使用的是有效的刷新令牌和访问令牌(在 playground 控制台上工作),但是当从 Java 应用程序 运行ning 时,我在此处获得需要登录 401。我需要这个用于从服务器直接备份到云端硬盘。
我可以只使用刷新令牌访问吗,因为它不会过期?
没有。您必须将刷新令牌转换为访问令牌。
您不能在您的应用程序中使用来自 Playgorund 的访问或刷新令牌。这些由 google 发行的代币只能在操场上使用。您获得的令牌与 Client Id 和 Client Secret 相关联。显然,您的 CLIENT_ID 和 CLIENT_SECRET 与 Google Playground 应用程序使用的不同。
您确实需要您的应用程序来请求这些令牌,因此您第一次需要一个浏览器,以便用户可以接受您的应用程序(而不是 Google Playground)正在将您的信息存储在 google。这称为 "user consent",并显示在本页的小图中:Using OAuth 2.0 for Web Server Applications)
然后,当您拥有应用程序的刷新令牌时。您不再需要浏览器进行日常备份。
您可以将您的代码与您的应用程序的有效刷新令牌一起使用,如 post.
中所示
我正在尝试使用从 OAuth Playground 发出的刷新令牌访问 GoogleDrive API(我自己的 a/c),如下所示。我正在使用我的刷新令牌和访问令牌进行离线访问,但我收到 401 未经授权。我的代码基于参考 belwoand google-api javadocs recommendation for building an offline request
我不想使用浏览器,我希望运行从服务器端应用程序上传到我自己的 a/c。
ref:
代码:
public static void main(String[] args) throws IOException {
HttpTransport TRANSPORT = new NetHttpTransport();
JsonFactory JSON_FACTORY = new JacksonFactory();
String refreshTokenString="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; //from console
String accessTokenString ="yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"; //from console
GoogleCredential credential = createCredentialWithRefreshToken(
TRANSPORT, JSON_FACTORY, new TokenResponse().setRefreshToken(refreshTokenString));
credential.setAccessToken("accessTokenString");
//exeucute HTTP request for offline accessTokenString
// Execute HTTP GET request to revoke current token.
HttpResponse response = TRANSPORT.createRequestFactory()
.buildGetRequest(new GenericUrl(
String.format(
"https://www.googleapis.com/drive/v2/changes",
credential.getAccessToken()))).execute();
System.out.println("RESPONSE: " +response);
}
public static GoogleCredential createCredentialWithRefreshToken(HttpTransport transport,
JsonFactory jsonFactory, TokenResponse tokenResponse) {
HttpTransport TRANSPORT = new NetHttpTransport();
JsonFactory JSON_FACTORY = new JacksonFactory();
return new GoogleCredential.Builder().setTransport(transport)
.setJsonFactory(JSON_FACTORY)
.setClientSecrets(CLIENT_ID, CLIENT_SECRET)
.build()
.setFromTokenResponse(tokenResponse);
}
错误:
{
"error": {
"errors": [
{
"domain": "global",
"reason": "required",
"message": "Login Required",
"locationType": "header",
"location": "Authorization"
}
],
"code": 401,
"message": "Login Required"
}
}
我使用的是有效的刷新令牌和访问令牌(在 playground 控制台上工作),但是当从 Java 应用程序 运行ning 时,我在此处获得需要登录 401。我需要这个用于从服务器直接备份到云端硬盘。
我可以只使用刷新令牌访问吗,因为它不会过期?
没有。您必须将刷新令牌转换为访问令牌。
您不能在您的应用程序中使用来自 Playgorund 的访问或刷新令牌。这些由 google 发行的代币只能在操场上使用。您获得的令牌与 Client Id 和 Client Secret 相关联。显然,您的 CLIENT_ID 和 CLIENT_SECRET 与 Google Playground 应用程序使用的不同。
您确实需要您的应用程序来请求这些令牌,因此您第一次需要一个浏览器,以便用户可以接受您的应用程序(而不是 Google Playground)正在将您的信息存储在 google。这称为 "user consent",并显示在本页的小图中:Using OAuth 2.0 for Web Server Applications)
然后,当您拥有应用程序的刷新令牌时。您不再需要浏览器进行日常备份。 您可以将您的代码与您的应用程序的有效刷新令牌一起使用,如 post.
中所示