Так что в настоящее время я работаю над приложением с Dialogflow системой API для Java (в частности, Gradle и Springboot)
Я хочу создать sessionEntityType для моего приложения Dialogflow, над которым я работаю. Но сначала мне нужно аутентифицировать мой Java API, который создаст сущность. Итак, сначала я создал учетную запись службы и сгенерировал ключ для использования так же, как этот учебник предлагает. После этого я создал на своем компьютере переменную среды с именем GOOGLE_APPLICATION_CREDENTIALS и связал ее с путем к ключу JSON. Мой первый вопрос: вам нужно инициализировать gcloud SDK, набрав: "gcloud init" в вашем cmd. Потому что даже когда я инициализирую его и устанавливаю переменную среды, я получаю следующую ошибку:
Тогда я подумал, что, может быть, он не может найти мой файл 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, но я понятия не имею, что.
С удовольствием оценил бы это, если бы кто-то знал, что происходит. Также вот роли, которые имеет моя учетная запись службы:
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'