Моя конкретная проблема -
, когда я звоню
driveService.files().export(fileId, "text/csv").executeMediaAndDownloadTo(outputStream);
Из моего приложения я получаю
11-22 00:35:02.489 : com.google.api.client.http.HttpResponseException: 401 Unauthorized
11-22 00:35:02.490 : {
11-22 00:35:02.491 : "error": {
11-22 00:35:02.491 : "errors": [
11-22 00:35:02.491 : {
11-22 00:35:02.491 : "domain": "global",
11-22 00:35:02.491 : "reason": "authError",
11-22 00:35:02.491 : "message": "Invalid Credentials",
11-22 00:35:02.492 : "locationType": "header",
11-22 00:35:02.492 : "location": "Authorization"
11-22 00:35:02.492 : }
11-22 00:35:02.492 : ],
11-22 00:35:02.492 : "code": 401,
11-22 00:35:02.492 : "message": "Invalid Credentials"
11-22 00:35:02.493 : }
11-22 00:35:02.493 : }
, когда я использую Проводник API в Services / Drive API v3/ drive.files.export Я получаю нужные данные.
Мои вопросы:
Как я могу решить эту проблему.
Когда я получаю учетную запись Google при входе в систему ... разве этого недостаточно, чтобы знать введенный мной пароль / пароль и зарегистрированный на смартфоне ... Я прав?
Какой минимальный набор разрешений мне нужно установить на стороне сервера, чтобы иметь разрешения
Как проверить, какая проблема связана с определенными разрешениями?не разрешается загружать лист Google с диска Google?
Большое спасибо за любой ответ.
Мои фрагменты кода Java, связанные с этой проблемой (вход в систему)
На стороне сервера
Мои учетные данные для приложения:
- Веб-клиент
- Клиент Android
Я использую идентификатор клиента «веб-клиента». Если я использую clientId клиента Android, я не получаю API библиотеки библиотеки idToken
:
- Google Drive API Авторизация запросов с использованием Oauth 2.0 - на drive.files.export
- Google Sheet API
В приложении для Android
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(this.googleClientId)
.requestEmail()
.build();
...
mGoogleSignInClient = GoogleSignIn.getClient(this, gso);
...
Intent signInIntent = mGoogleSignInClient.getSignInIntent();
startActivityForResult(signInIntent, RC_SIGN_IN);
...
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RC_SIGN_IN) {
validateGoogleUser(data);
}
}
...
Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(this.dataIntent);
...
GoogleSignInAccount account = task.getResult(ApiException.class);
...
// It returns my account with id / idToken / mail / names / ... more
And then... I continue
В методеЯ пытаюсь скачать это код
//TODO: move this to a service and to a dao
final HttpTransport HTTP_TRANSPORT = AndroidHttp.newCompatibleTransport();;
GoogleCredential credential = new GoogleCredential().setAccessToken(accessToken);
Drive driveService = new Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential)
.setApplicationName(applicationName)
.build();
String fileId = idSheet;
//TODO: Check how to check progress and limit size of download or cancel the operation after n seconds
OutputStream outputStream = new ByteArrayOutputStream();
driveService.files().export(fileId, "text/csv")
.executeMediaAndDownloadTo(outputStream);
ПРИМЕЧАНИЕ: я не использую - GoogleIdTokenVerifier.verify
, и я не знаю, что это такое ... так как я уже получил свой аккаунтИнформация.