В настоящее время я разрабатываю приложение для Android, которое требует, чтобы пользователь вошел в Google, а затем проверил его, запустив сценарий Apps, чтобы выяснить, является ли пользователь частью группы Google (я не смог выяснить,как сделать это вне использования скриптов приложений).Я могу заставить пользователя войти в систему с помощью Firebase Authentication, но независимо от того, что я пытаюсь, я не могу запустить скрипт приложений (сам скрипт работает, так как он может запускаться из браузера), так как я не могу получитьправо авторизации (я получаю ошибки 401 и 403).
Вот некоторые вещи, которые я пробовал:
Использование API скриптов Google Apps
Script service = new Script.Builder(new NetHttpTransport(),
JacksonFactory.getDefaultInstance(), credentials).setApplicationName(APPLICATION_NAME)
.build();
ExecutionRequest request = new ExecutionRequest()
.setFunction("functionName");
Operation op = service.scripts().run(MY_SCRIPT_ID, request).execute();
if (op.getResponse() != null && op.getResponse().get("result") != null) {
return op.getResponse().get("result");
}
(https://developers.google.com/apps-script/api/how-tos/execute)
Использование POST-запроса
URL url = new URL("MY_SCRIPT_URL" + "?access_token=" + ACCESS_TOKEN);
URLConnection conn = url.openConnection();
conn.setDoOutput(true);
HttpURLConnection urlConn = (HttpURLConnection) conn;
urlConn.setRequestProperty("Authorization", "Bearer " + ACCESS_TOKEN);
OutputStreamWriter wr = new OutputStreamWriter(urlConn.getOutputStream());
wr.write("");
wr.flush();
wr.close();
if(urlConn.getResponseCode() == 200){
BufferedReader reader = new BufferedReader(urlConn.getOutputStream());
//....AND HERE I READ FROM THE OUTPUT STREAM
}
( Запуск скрипта Google Apps в Android , Как передать значение заголовка «Авторизация»в OAuth 2.0 с API Google , Добавить заголовок для запроса на публикацию в строке , https://developers.google.com/identity/protocols/OAuth2InstalledApp)
Где я пытался сделать credentials
следующими способами:
Использование токена доступа для аутентификации Firebase
GoogleCredential credentials = new GoogleCredential()
.createScoped(Arrays.asList(ScriptScopes.GROUPS))
.setAccessToken(FIREBASE_ACCESS_TOKEN);
Использование учетной записи службы
InputStream in = activity.getAssets().open("SERVICE_INFO_FILE");
GoogleCredential credentials = GoogleCredential.fromStream(new FileInputStream(in))
.createScoped(Arrays.asList(ScriptScopes.GROUPS));
credentials.refreshToken();
ИспользованиеСекрет клиента
GoogleCredential credentials = new GoogleCredential.Builder()
.setClientSecrets("CLIENT_ID", "CLIENT_SECRET").build()
.createScoped(Arrays.asList(ScriptScopes.GROUPS));
Некоторые другие примечания:
- Сценарий Apps связан с тем же проектом Google Cloud, что и учетная запись службы и Firebase.project.
- Секрет клиента был создан для API скриптов приложений.
Итак, как правильно выполнить аутентификацию для доступа к скрипту приложений в качестве пользователя? И есть ли другой способ?доступа в какие группы Google входит пользователь?
Заранее спасибо!
РЕДАКТИРОВАТЬ
WhiИспользуя следующий код, я, кажется, получил его для правильной аутентификации:
GoogleAccountCredential credentials = GoogleAccountCredential.usingOAuth2(activity, Arrays.asList(ScriptScopes.GROUPS));
credentials.getSelectedAccountName(FirebaseAuth.getInstance().getCurrentUser().getEmail());
Script service = new Script.Builder(new NetHttpTransport(),
JacksonFactory.getDefaultInstance(), credentials).setApplicationName(APPLICATION_NAME)
.build();
ExecutionRequest request = new ExecutionRequest()
.setFunction("testGroup");
Operation op = service.scripts().run(MY_SCRIPT_ID, request).execute();
Но когда он достигает последней строки, все приложение зависает и в итоге перестает работать.Я предполагаю, что это потому, что приложение ждет, пока скрипт скрипта что-то вернет?Любые идеи о том, как это исправить?
Вот код скрипта приложения между прочим:
function testGroup() {
//return 0;
var groups = GroupsApp.getGroups();
for(var i = 0; i < groups.length; i++){
//Logger.log(groups[i].getEmail());
if(groups[i].getEmail().equals('group1')){
return 0;
}else if(groups[i].getEmail().equals('group2')){
return 1;
}
}
return -1;
}
(Даже когда я просто возвращаю 0, он все равно не работает).