GOOGLE_APPLICATION_CREDENTIALS не может быть найден - PullRequest
1 голос
/ 04 мая 2020

В настоящее время приходится интегрировать службы Google Cloud Platform в мое приложение, но появляется следующее исключение:

**W/System.err: java.io.IOException: The Application Default Credentials are not available. They are available if running in Google Compute Engine. Otherwise, the environment variable GOOGLE_APPLICATION_CREDENTIALS must be defined pointing to a file defining the credentials. See https://developers.google.com/accounts/docs/application-default-credentials for more information.
        at com.google.auth.oauth2.DefaultCredentialsProvider.getDefaultCredentials(DefaultCredentialsProvider.java:134)
W/System.err:     at com.google.auth.oauth2.GoogleCredentials.getApplicationDefault(GoogleCredentials.java:119)
        at com.google.auth.oauth2.GoogleCredentials.getApplicationDefault(GoogleCredentials.java:91)
        at com.google.api.gax.core.GoogleCredentialsProvider.getCredentials(GoogleCredentialsProvider.java:67)
        at com.google.api.gax.rpc.ClientContext.create(ClientContext.java:135)
        at com.google.cloud.speech.v1.stub.GrpcSpeechStub.create(GrpcSpeechStub.java:94)
        at com.google.cloud.speech.v1.stub.SpeechStubSettings.createStub(SpeechStubSettings.java:131)
        at com.google.cloud.speech.v1.SpeechClient.<init>(SpeechClient.java:144)
        at com.google.cloud.speech.v1.SpeechClient.create(SpeechClient.java:126)
        at com.google.cloud.speech.v1.SpeechClient.create(SpeechClient.java:118)
        at com.dno.app.ui.TranscriptFragment$1.onClick(TranscriptFragment.java:72)**

Задана переменная среды:

environment_variable

. json файл находится здесь:

.json file

приложение падает на authImplicit () в этом блоке кода (фрагмент):

    transcriptBtn = getActivity().findViewById(R.id.transcript_button);
    transcriptBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            try (SpeechClient speechClient = SpeechClient.create()) {
                authImplicit(); // issue with Google Platform Login Authentification
                // - does not read the environment variable, and therefore cannot get access to the .json file.

                // The path to the audio file to transcribe
                String fileName = getFile().getName();

                // Reads the audio file into memory
                Path path = Paths.get(fileName);

                byte[] data = Files.readAllBytes(path);
                ByteString audioBytes = ByteString.copyFrom(data);

                // Builds the sync recognize request
                RecognitionConfig config =
                        RecognitionConfig.newBuilder()
                                .setEncoding(RecognitionConfig.AudioEncoding.FLAC)
                                .setSampleRateHertz(16000)
                                .setLanguageCode("en-US")
                                .build();
                RecognitionAudio audio = RecognitionAudio.newBuilder().setContent(audioBytes).build();

                // Performs speech recognition on the audio file
                RecognizeResponse response = speechClient.recognize(config, audio);
                List<SpeechRecognitionResult> results = response.getResultsList();

                for (SpeechRecognitionResult result : results) {
                    // There can be several alternative transcripts for a given chunk of speech. Just use the
                    // first (most likely) one here.
                    SpeechRecognitionAlternative alternative = result.getAlternativesList().get(0);
                    System.out.printf("Transcription: %s%n", alternative.getTranscript());
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    });

код для authImplicit ():

 private void authImplicit() {
        // If you don't specify credentials when constructing the client, the client library will
        // look for credentials via the environment variable GOOGLE_APPLICATION_CREDENTIALS.
        Storage storage = StorageOptions.getDefaultInstance().getService();

        System.out.println("Buckets:");
        Page<Bucket> buckets = storage.list();
        for (Bucket bucket : buckets.iterateAll()) {
            System.out.println(bucket.toString());
        }
    }

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

РЕДАКТИРОВАТЬ (все еще не работает): я пытался использовать этот пример, но он все еще не работает: Учетные данные приложения по умолчанию недоступны

1 Ответ

2 голосов
/ 04 мая 2020

Я понимаю, что вы прочитали документацию и выполнили все шаги, указанные здесь - https://cloud.google.com/storage/docs/reference/libraries#windows

  1. Как упоминал @Джон Хэнли, вы проверить печать переменных среды?

  2. Это определенно не связано с правами доступа владельца, поскольку исключение говорит java.io.IOException: The Application Default Credentials are not available. They are available if running in Google Compute Engine. Otherwise, the environment variable GOOGLE_APPLICATION_CREDENTIALS must be defined pointing to a file defining the credentials. See https://developers.google.com/accounts/docs/application-default-credentials for more information.

Теперь, чтобы решить эту проблему, выполните Вы хотите сделать только с помощью переменных среды? или другие подходы подойдут?

если вы согласны с другими подходами, взгляните на этот код

private void authImplicit() {

    //please give exact file name for this credentials.json
    Credentials credentials = GoogleCredentials
      .fromStream(new FileInputStream("C:\\Users\\dbgno\\Keys\\credentials.json"));
    Storage storage = StorageOptions.newBuilder().setCredentials(credentials)
      .setProjectId("Some Project").build().getService();

    System.out.println("Buckets:");
    Page<Bucket> buckets = storage.list();
    for (Bucket bucket : buckets.iterateAll()) {
        System.out.println(bucket.toString());
    }
}

Редактировать 1: работа над решением Попробуйте это и посмотрите, сможете ли вы прочитать файл JSON, который вы даете в качестве ввода. В заявлении на печать должна быть указана учетная запись службы, с помощью которой вы собираетесь аутентифицировать

    public static Credential getDriveService(String fileLocation, String servAccAdmin)
      throws IOException {
    HttpTransport httpTransport = new NetHttpTransport();
    JsonFactory jsonFactory = new JacksonFactory();

    GoogleCredential googleCredential =
        GoogleCredential.fromStream(new FileInputStream(fileLocation), httpTransport, jsonFactory)
            .createScoped(SCOPES);
    System.out.println("--------------- " + googleCredential.getServiceAccountId());

    Credential credential = new GoogleCredential.Builder()
        .setTransport(googleCredential.getTransport())
        .setJsonFactory(googleCredential.getJsonFactory())
        .setServiceAccountPrivateKeyId(googleCredential.getServiceAccountPrivateKeyId())
        .setServiceAccountId(googleCredential.getServiceAccountId()).setServiceAccountScopes(SCOPES)
        .setServiceAccountPrivateKey(googleCredential.getServiceAccountPrivateKey())
        .setServiceAccountUser(servAccAdmin).build();

    return credential;
}

Редактировать 2:

Поскольку мы видим проблему с учетными данными, я пытаюсь чтобы увидеть, как я получаю доступ к любой другой службе API Google, может ли это быть диск или gmail, где мы вручную передаем файл ключа и создаем учетные данные, и эти учетные данные следует использовать при последующих вызовах службы. Теперь попробуйте добавить эти зависимости, это просто для устранения неполадок, используя тот же способ, которым мы получаем доступ к google drive / gmail и т. Д. c. Мы узнаем, может ли облачный API Google создать учетные данные или нет

<dependency>
  <groupId>com.google.http-client</groupId>
  <artifactId>google-http-client</artifactId>
  <version>${project.http.version}</version>
</dependency>
<dependency>
  <groupId>com.google.http-client</groupId>
  <artifactId>google-http-client-jackson2</artifactId>
  <version>${project.http.version}</version>
</dependency>
<dependency>
  <groupId>com.google.oauth-client</groupId>
  <artifactId>google-oauth-client-jetty</artifactId>
  <version>${project.oauth.version}</version>
</dependency>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...