Как несколько пользователей одновременно используют Google Cloud Speech

Я создаю приложение, использующее Google Cloud Speech.

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

Он хорошо работает, когда используется одним пользователем, но не работает, когда несколько пользователей используют его одновременно.

Например, доступен только один пользователь или все недоступны.

Права на ключ сервисной учетной записи принадлежат владельцу проекта.

Я думаю, что это проблема с ключевой учетной записью службы ... Как мне это исправить?

private class AccessTokenTask extends AsyncTask<Void, Void, AccessToken> {

    @Override
    protected AccessToken doInBackground(Void... voids) {

        final SharedPreferences prefs = mContext.getSharedPreferences(PREFS, Context.MODE_PRIVATE);
        String tokenValue = prefs.getString(PREF_ACCESS_TOKEN_VALUE, null);
        long expirationTime = prefs.getLong(PREF_ACCESS_TOKEN_EXPIRATION_TIME, -1);

        // Check if the current token is still valid for a while
        if (tokenValue != null && expirationTime > 0) {
            if (expirationTime > System.currentTimeMillis() + ACCESS_TOKEN_EXPIRATION_TOLERANCE) {
                return new AccessToken(tokenValue, new Date(expirationTime));
            }
        }

        final InputStream stream = mContext.getResources().openRawResource(R.raw.credential);
        try {
            final GoogleCredentials credentials = GoogleCredentials.fromStream(stream).createScoped(SCOPE);
            final AccessToken token = credentials.refreshAccessToken();
            prefs.edit()
                    .putString(PREF_ACCESS_TOKEN_VALUE, token.getTokenValue())
                    .putLong(PREF_ACCESS_TOKEN_EXPIRATION_TIME, token.getExpirationTime().getTime())
                    .apply();
            return token;
        } catch (IOException e) {
            Log.e(TAG, "Failed to obtain access token.", e);
        }
        return null;
    }

    @Override
    protected void onPostExecute(AccessToken accessToken) {
        mAccessTokenTask = null;
        final ManagedChannel channel = new OkHttpChannelProvider()
                .builderForAddress(GOOGLE_API_HOSTNAME, GOOGLE_API_PORT)
                .nameResolverFactory(new DnsNameResolverProvider())
                .intercept(new GoogleCredentialsInterceptor(new GoogleCredentials(accessToken)
                        .createScoped(SCOPE)))
                .build();
        mApi = SpeechGrpc.newStub(channel);

        // Schedule access token refresh before it expires
        if (mHandler != null) {
            mHandler.postDelayed(mFetchAccessTokenRunnable,
                    Math.max(accessToken.getExpirationTime().getTime() - System.currentTimeMillis() - ACCESS_TOKEN_FETCH_MARGIN, ACCESS_TOKEN_EXPIRATION_TOLERANCE));
        }
    }
}

Этот код представляет собой код, который вызывает файл credential.json на Android и получает токен доступа.

Сервер для этого приложения - python и общается через http.

https://github.com/GoogleCloudPlatform/android-docs-samples/tree/master/speech/Speech

Описание в приведенной выше ссылке говорит вам делегировать аутентификацию серверу.

Я хочу написать эту часть с помощью кода Python. Что я должен делать?


person Backkom    schedule 14.05.2018    source источник
comment
Не могли бы вы предоставить код или дополнительную информацию о том, как вы вызываете API? Так будет легче понять, что происходит.   -  person Rubén C.    schedule 14.05.2018
comment
Хорошо подождем. Держите вопрос в актуальном состоянии и, если вы не нашли проблему, ответьте, пожалуйста, на мой вопрос.   -  person Rubén C.    schedule 15.05.2018
comment
@ RubénC. Я отправил дополнительные вопросы. Помощь.   -  person Backkom    schedule 18.05.2018


Ответы (1)


По ссылке, которую вы указали в описании, они предлагают вам сначала прочитать документ об основных концепциях аутентификации. В вашем случае используйте служебную учетную запись для приложения Android.

Я понимаю, что вы уже смогли предоставить учетные данные конечного пользователя в Google Cloud Platform API, например Cloud Speech API.

Если вы хотите аутентифицировать несколько пользователей в своем приложении, вы должны вместо этого использовать Аутентификация Firebase. Ссылка содержит краткое объяснение и учебное пособие.

Существует несколько клиентских библиотек Python для GCP, которые вы можете использовать в зависимости от того, какие операции вы хотите выполнить на сервере. Что касается аутентификации Python на стороне сервера, эта документация показывает, как аутентификация для Google Cloud Storage работает (имейте в виду этот пример в качестве справки).

person Rubén C.    schedule 18.05.2018