Настройка аутентификации Dialogflow для API Java выдает ошибку needsCredentials - PullRequest
0 голосов
/ 27 июня 2019

Так что в настоящее время я работаю над приложением с Dialogflow системой API для Java (в частности, Gradle и Springboot)

Я хочу создать sessionEntityType для моего приложения Dialogflow, над которым я работаю. Но сначала мне нужно аутентифицировать мой Java API, который создаст сущность. Итак, сначала я создал учетную запись службы и сгенерировал ключ для использования так же, как этот учебник предлагает. После этого я создал на своем компьютере переменную среды с именем GOOGLE_APPLICATION_CREDENTIALS и связал ее с путем к ключу JSON. Мой первый вопрос: вам нужно инициализировать gcloud SDK, набрав: "gcloud init" в вашем cmd. Потому что даже когда я инициализирую его и устанавливаю переменную среды, я получаю следующую ошибку:

Error

Тогда я подумал, что, может быть, он не может найти мой файл JSON, поэтому я получил Файл (ключ JSON) в своем контроллере Java и сделал мои собственные SessionSettings. Вот как выглядит код:

private void startConnection(){
    try{
        String uuid = UUID.randomUUID().toString();

        File credentialFile = new File("D:\\Documenten\\_FreeTime\\NerdProjects\\ehv-assistent\\ehvlincassistent-bbf84b54cf39.json");
        InputStream stream = new FileInputStream(credentialFile);
        GoogleCredentials credentials = GoogleCredentials.fromStream(stream);
        String projectId = ((ServiceAccountCredentials)credentials).getProjectId();
        AccessToken token = (credentials).getAccessToken();

        SessionsSettings.Builder settingsBuilder = SessionsSettings.newBuilder();
        SessionsSettings sessionsSettings = settingsBuilder.setCredentialsProvider(FixedCredentialsProvider.create(credentials)).build();
        SessionsClient sessionsClient = SessionsClient.create(sessionsSettings);
        SessionName session = SessionName.of(projectId, uuid);

        logger.info(session.getSession());
    } catch (Exception e){
        e.printStackTrace();
    }
}

Я видел, что AccessToken null - это не что иное, что я не могу найти что-то не так с ним, хотя он все еще дает мне ту же ошибку, как вы можете видеть выше.

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

private void startConnection(){
    PrivateKey privKey = null;

    StringBuilder pkcs8Lines = new StringBuilder();
    BufferedReader rdr = new BufferedReader(new StringReader("privateKey"));


    String line;
    try{
        while ((line = rdr.readLine()) != null) {
            pkcs8Lines.append(line);
        }
    } catch (Exception e){
        logger.info(e.getMessage());
    }

    // Remove the "BEGIN" and "END" lines, as well as any whitespace

    String pkcs8Pem = pkcs8Lines.toString();
    pkcs8Pem = pkcs8Pem.replace("-----BEGIN PRIVATE KEY-----", "");
    pkcs8Pem = pkcs8Pem.replace("-----END PRIVATE KEY-----", "");
    pkcs8Pem = pkcs8Pem.replaceAll("\\s+", "");

    // Base64 decode the result

    byte[] pkcs8EncodedBytes = Base64.getDecoder().decode(pkcs8Pem);

    // extract the private key

    PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(pkcs8EncodedBytes);
    KeyFactory kf;
    try {
        kf = KeyFactory.getInstance("RSA");
        try {
            privKey = kf.generatePrivate(keySpec);
        } catch (InvalidKeySpecException e) {
            logger.info(e.getMessage());
        }
    } catch (NoSuchAlgorithmException e) {
        logger.info(e.getMessage());
    }

    Credentials myCredentials = ServiceAccountCredentials.newBuilder().setProjectId(projectId)
            .setPrivateKeyId(privateKeyId).setPrivateKey(privKey)
            .setClientEmail(clientEmail).setClientId(clientId)
            .setTokenServerUri(URI.create(tokenServerUri)).build();

    try {
        SessionsSettings sessionsSettings = SessionsSettings.newBuilder()
                .setCredentialsProvider(FixedCredentialsProvider.create(myCredentials)).build();

        SessionsClient sessionsClient = SessionsClient.create(sessionsSettings);
    } catch (Exception e){
        logger.info(e.getMessage());
    }
}

Это также дало мне ту же ошибку. Я начинаю думать, что что-то не так с моим ключом JSON или gcloud SDK, но я понятия не имею, что.

С удовольствием оценил бы это, если бы кто-то знал, что происходит. Также вот роли, которые имеет моя учетная запись службы:

Roles

EDIT: после еще одной игры я пришел к выводу, что, возможно, мои зависимости неверны, поэтому я просто вставляю их, чтобы вы могли их видеть. Было бы полезно, если бы кто-то мог дать мне совет, какие зависимости мне нужно использовать, чтобы это работало.

compile group: 'com.google.apis', name: 'google-api-services-dialogflow', version: 'v2-rev81-1.25.0'
compile group: 'com.google.cloud', name: 'google-cloud-dialogflow', version: '0.97.0-alpha'
...