#reactjs #google-authentication #dialogflow-cx
#reactjs #google-аутентификация #dialogflow-cx
Вопрос:
Я хочу взаимодействовать с API Dialogflow CX из моего приложения React. Соответствующий код выглядит следующим образом:
componentWillMount() {
let payload = {
"queryInput": {
"text": {
"text": "Hi!"
},
"languageCode": "en"
},
"queryParams": {
"timeZone": "America/Los_Angeles"
}
}
axios.post('https://global-dialogflow.googleapis.com/v3/' this.state.projectId '/sessions/' this.state.sessionId ':detectIntent', payload)
.then(response => {
this.setState({ dialogResponse: response });
})
.catch(error => {
console.log(error)
})
console.log(this.state.dialogResponse)
}
Тем не менее, ответ 401
.
Я создал учетную запись службы и загрузил закрытый ключ в виде файла JSON в соответствии с https://cloud.google.com/docs/authentication /.
Как мне затем использовать это для аутентификации моего вызова API?
Комментарии:
1. Привет! Может быть, это глупое замечание, но Google не разрешает использовать API, пока вы не активируете его из облачной консоли: вам нужно перейти на страницу облачной консоли (console.cloud.google.com ), затем на левой панели нажмите на API и службы, затем синим цветом под строкой поиска «включить API и службы».. наконец, найдите API Dialogflow и включите его для своей платежной учетной записи. Вы это сделали?
2. Да, я это сделал!
3. Можете ли вы запустить тот же API в postman? Также есть сообщение об ошибке в ответе 401?
Ответ №1:
Согласно документам, использование ключа учетной записи службы (того, который вы загрузили в виде файла JSON) предназначено только для
Доступ к личным данным от имени учетной записи службы за пределами облачных сред Google
Они используются, когда:
- пользователь не присутствует для аутентификации; или
- запросы на стороне сервера, которым не нужен пользователь.
Для вашего варианта использования я предполагаю, что это для последнего, поскольку вы используете Dialogflow. Переместите этот вызов api в свой серверный код, например, настроив облачную функцию, lambda или приложение expressjs, запущенное где-нибудь.
Не запускайте этот запрос в React по 2 основным причинам:
- React работает на стороне клиента, что означает, что пользователи будут иметь доступ к вашему исходному коду, включая ваш закрытый ключ. Большой риск для безопасности.
- Dialogflow не нуждается в аутентификации пользователя для работы.
Чтобы добавить аутентификацию по вашему запросу и использовать Dialog CX, вы можете выполнить следующие шаги, которые в общих чертах описаны здесь. Обратите внимание, эти шаги предназначены для случаев, когда ваш сервер работает в GCP или вне его. У Google есть встроенная функциональность, если ваш код выполняется в GCP, но я объясню ту, которая работает везде. Все это должно быть в вашем приложении cloud function / lambda / expressjs, поэтому, если вы не знакомы с этим исследованием, как его настроить и как вы можете сначала вызвать это в React.
- установите dot-env и требуйте его
npm install dotenv
илиyarn add dotenv
- требуется dotenv в приложении
require('dotenv').config()
- Загрузите закрытый ключ json и сохраните его где-нибудь в папке вашего проекта)
- добавьте
.env
в свой.gitignore
файл, если его там еще нет - создайте
.env
файл и добавьте это в негоGOOGLE_APPLICATION_CREDENTIALS="[PATH TO YOUR PRIVATE KEY]"
- установите библиотеку Dialogflow CX
npm install @google-cloud/dialogflow-cx
- Используйте библиотеку Dialogflow в соответствии с ее документами здесь . Закрытый служебный ключ будет автоматически обнаружен при использовании библиотеки.
- В рабочей среде обязательно добавьте
GOOGLE_APPLICATION_CREDENTIALS="[PATH TO YOUR PRIVATE KEY]"
в качестве переменной среды облачную функцию, lambda, docker или что-то еще, что вы будете использовать.
В качестве дополнительного примечания обновите свои закрытые ключи и удалите их из папки проекта React, если вы уже зафиксировали их в своем репозитории github.
Комментарии:
1. Спасибо за ваш вклад, это дало мне несколько советов, которые помогут мне двигаться в правильном направлении!
Ответ №2:
В конце концов, я не смог заставить его работать, добавив учетные данные JSON .env
в (did install dotenv
). Что я в итоге сделал:
- Переместите вызов API на мой экспресс-сервер
- Добавьте файл JSON в папку моего проекта
- Используйте
@google-cloud/dialogflow-cx
библиотеку следующим образом:const { SessionsClient } = require('@google-cloud/dialogflow-cx'); const client = new SessionsClient({ keyFilename: "./my-file-name.json" //include the JSON file here! }); ... app.get('/input', async (req, res, next) => { try { const sessionId = Math.random().toString(36).substring(7); const sessionPath = client.projectLocationAgentSessionPath( projectId, location, agentId, sessionId ); console.info(sessionPath); const request = { session: sessionPath, queryInput: { text: { text: 'Hi there', }, languageCode, }, }; const [response] = await client.detectIntent(request); for (const message of response.queryResult.responseMessages) { if (message.text) { console.log(`Agent Response: ${message.text.text}`); } } if (response.queryResult.match.intent) { console.log( `Matched Intent: ${response.queryResult.match.intent.displayName}` ); } console.log( `Current Page: ${response.queryResult.currentPage.displayName}` );
} перехват (ошибка) {
возврат next (ошибка)
}
})