Запуск скрипта приложения на Android? - PullRequest
0 голосов
/ 18 октября 2018

В настоящее время я разрабатываю приложение для Android, которое требует, чтобы пользователь вошел в Google, а затем проверил его, запустив сценарий Apps, чтобы выяснить, является ли пользователь частью группы Google (я не смог выяснить,как сделать это вне использования скриптов приложений).Я могу заставить пользователя войти в систему с помощью Firebase Authentication, но независимо от того, что я пытаюсь, я не могу запустить скрипт приложений (сам скрипт работает, так как он может запускаться из браузера), так как я не могу получитьправо авторизации (я получаю ошибки 401 и 403).

Вот некоторые вещи, которые я пробовал:

  1. Использование 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 следующими способами:

  1. Использование токена доступа для аутентификации Firebase

    GoogleCredential credentials = new GoogleCredential()
        .createScoped(Arrays.asList(ScriptScopes.GROUPS))
        .setAccessToken(FIREBASE_ACCESS_TOKEN);
    
  2. Использование учетной записи службы

    InputStream in = activity.getAssets().open("SERVICE_INFO_FILE");
    
    GoogleCredential credentials = GoogleCredential.fromStream(new FileInputStream(in))
        .createScoped(Arrays.asList(ScriptScopes.GROUPS));
    
    credentials.refreshToken();
    
  3. ИспользованиеСекрет клиента

    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, он все равно не работает).

1 Ответ

0 голосов
/ 18 октября 2018

используйте клиентскую библиотеку API сценариев для Java вместе с oauth2 :

implementation "com.google.apis:google-api-services-script:v1-rev271-1.25.0"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...