Аутентификация Dialogflow программно Java - PullRequest
2 голосов
/ 26 марта 2019

Привет, у меня проблема с аутентификацией диалогового потока.Я знаю, что должен установить GOOGLE_APPLICATION_CREDENTIALS или загрузить Gcloud CLI, чтобы получить доступ к моему агенту.Но так как я собираюсь использовать несколько агентов, мне нужно войти в систему с учетными данными для моего API.Поэтому я не хочу использовать эти методы.

Я видел в другом потоке, что есть код, доступный для node.js, который делает именно то, что я хочу.

Dialogflow - простой способ авторизации .

Я хочу иметь возможность обрабатывать загруженный файл JSON, чтобы получить доступ к агенту диалогового потока.

Этоэто то, что я пытался:

//Load the json file 
 String credential = "JSON{}"
 //Read the json file
 GoogleCredentials credentials = GoogleCredentials.fromStream(new 
 ByteArrayInputStream(credential.getBytes())); 
 //Read the project ID           
 String projectId = ((ServiceAccountCredentials)credentials).getProjectId();
 System.out.println("the ID"+ projectId);
 //Read the token
 AccessToken token = ((ServiceAccountCredentials)credentials).getAccessToken();
 System.out.println("the token "+ token);

Отображает идентификатор проекта, но токен является нулевым.и ошибка, которую я получаю:

"message": "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.",

Итак, я застрял, как программно подключиться к другим агентам?без использования GOOGLE_APPLICATION_CREDENTIALS в Java?

Пожалуйста, помогите мне

1 Ответ

1 голос
/ 31 мая 2019

У меня была такая же проблема, и я думаю, что это то, что вы ищете.Я скопировал значения всех учетных данных конфигурации агента json в свой собственный файл конфигурации, проиндексированный каждым projectId, и я прочитал privatekey, privateKeyId, clientEmail, clientId, tokenServerUri из этого файла конфигурации.

Затем я создаю объект Credentials с этими значениями, а затем объект SessionSettings с учетными данными

Таким образом, вы можете забыть о переменной среды GOOGLE_APPLICATION_CREDENTIALS

        PrivateKey privKey = null;

        StringBuilder pkcs8Lines = new StringBuilder();
        BufferedReader rdr = new BufferedReader(new StringReader(privatekey);


        String line;
        while ((line = rdr.readLine()) != null) {
            pkcs8Lines.append(line);
        }

        // 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) {
                throw new GenericException(e);
            }
        } catch (NoSuchAlgorithmException e) {
            throw new GenericException(e);
        }

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

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

        try (SessionsClient sessionsClient = SessionsClient.create(sessionsSettings)) {
...