Как создать токен доступа в Java для API Google AutoML Vision без gcloud? - PullRequest
3 голосов
/ 18 апреля 2019

Я создаю приложение для Android, которое будет использовать Google AutoML Vision API. Я ищу способ получить токен постоянного доступа или сгенерировать их в коде, чтобы мне не нужно было использовать gcloud каждый раз, когда я хочу использовать свое приложение. Как бы я поступил так?

Я создал модель AutoML, настроил свою учетную запись службы и закодировал свое приложение в Android Studio, чтобы оно отправляло запрос к API с помощью Volley. Проблема в том, что они требуют, чтобы вы генерировали и передавали токен доступа с помощью gcloud. Я могу сгенерировать токен и вставить его в свой код, но он длится всего час, а затем истекает. REST API требует токен доступа, как показано ниже.

curl -X POST -H "Content-Type: application/json" \
-H "Authorization: Bearer $(gcloud auth application-default print-access- 
token)" 

Я рассмотрел эту проблему по-разному. Например, некоторые клиентские библиотеки Google для Java и облачные приложения Google показывают, как добавить учетные данные учетной записи службы в код. Я не совсем понимаю, как добавить файл ключа Json в код при запуске с телефона. Я также читал, что можно использовать Firebase, но я не знаю, каков будет процесс для этого.

В настоящее время я открою gcloud на своем компьютере, сгенерирую токен доступа, вставлю его в мой код и запустите приложение следующим образом с заголовком, и это вернет желаемые результаты в течение часа до истечения срока действия кода доступа.

@Override
public Map<String, String> getHeaders() throws AuthFailureError{
    Map<String, String> headers = new HashMap<>();
    headers.put("Authorization", "Bearer " + accesstoken);
    return headers;
 }

Мне бы хотелось, чтобы это было автономное приложение, которое может работать на телефоне Android. Каков наилучший способ сделать это?


UPDATE: Мне удалось добавить файл в Android Studio, а затем использовать некоторые функции для получения токена доступа, и он, похоже, работает в эмуляторе. Я не уверен, насколько безопасен этот метод, потому что файл json с ключом должен быть закрытым.

InputStream is = getAssets().open("app.json");
GoogleCredentials credentials = 
GoogleCredentials.fromStream(i).createScoped(Lists.newArrayList(scope));
credentials.refreshIfExpired();
AccessToken accesstoken = credentials.getAccessToken();
...