Вход в Google для Ассистента предоставляет пользователям и разработчикам самый простой и удобный интерфейс как для связывания учетных записей, так и для их создания. Ваше действие может запросить доступ к профилю Google вашего пользователя во время разговора, включая имя пользователя, адрес электронной почты и изображение профиля.
Информация профиля может использоваться для создания персонализированного пользовательского опыта в вашем действии. Если у вас есть приложения на других платформах и они используют вход в Google, вы также можете найти существующую учетную запись пользователя и связать ее с ней, создать новую учетную запись и установить прямой канал связи с пользователем.
Чтобы выполнить привязку учетной записи с помощью входа в Google, вы просите пользователя дать согласие на доступ к его профилю Google. Затем вы используете информацию в их профиле, например адрес электронной почты, для идентификации пользователя в вашей системе.
Реализация привязки учетной записи для входа в Google
Выполните действия, описанные в следующих разделах, чтобы добавить ссылку на учетную запись Google для входа в действие.
Настроить проект
Чтобы настроить свой проект для использования привязки учетной записи для входа в Google, выполните следующие действия:
- Откройте консоль действий и выберите проект.
- Откройте вкладку «Разработка» и выберите «Связывание учетной записи» .
- Включите переключатель рядом с пунктом «Привязка учетной записи» .
- В разделе Создание учетной записи выберите Да .
В поле «Тип связи» выберите «Войти в Google» .
Откройте «Информацию о клиенте» и обратите внимание на значение идентификатора клиента, присвоенного Google вашим действиям .
Нажмите Сохранить .
Разработайте голосовой пользовательский интерфейс для процесса аутентификации.
Проверьте, подтвержден ли пользователь, и запустите процесс привязки учетной записи.
- Откройте проект Actions Builder в консоли Actions .
- Создайте новую сцену, чтобы начать привязку учетной записи в своем действии:
- Нажмите «Сцены» .
- Нажмите значок добавления (+), чтобы добавить новую сцену.
- Во вновь созданной сцене щелкните значок « add для «Условия» .
- Добавьте условие, которое проверяет, является ли пользователь, связанный с беседой, проверенным пользователем. Если проверка не пройдена, ваше действие не сможет выполнить привязку учетной записи во время разговора и должно вернуться к предоставлению доступа к функциям, которые не требуют привязки учетной записи.
- В поле
Enter new expression
в разделе «Условие» введите следующую логику:user.verificationStatus != "VERIFIED"
- В разделе «Переход» выберите сцену, которая не требует привязки учетной записи, или сцену, которая является точкой входа в функции, доступные только для гостей.
- В поле
- Нажмите значок « add для «Условия» .
- Добавьте условие для запуска процесса связывания учетной записи, если у пользователя нет связанного удостоверения.
- В поле
Enter new expression
в разделе « Условие» введите следующую логику:user.verificationStatus == "VERIFIED"
- В разделе «Переход» выберите системную сцену «Связывание учетных записей» .
- Нажмите Сохранить .
- В поле
После сохранения в ваш проект добавляется новая сцена системы связывания учетных записей под названием <SceneName>_AccountLinking
.
Настройте сцену привязки учетной записи
- В разделе «Сцены» выберите сцену системы привязки учетной записи.
- Нажмите « Отправить запрос» и добавьте короткое предложение, описывающее пользователю, почему Действию необходим доступ к его личности (например, «Чтобы сохранить ваши настройки»).
- Нажмите Сохранить .
- В разделе «Условия» нажмите «Если пользователь успешно завершил привязку учетной записи» .
- Настройте, как должен действовать поток, если пользователь соглашается связать свою учетную запись. Например, вызовите веб-перехватчик для обработки любой необходимой пользовательской бизнес-логики и возврата к исходной сцене.
- Нажмите Сохранить .
- В разделе «Условия» выберите «Если пользователь отменяет или отклоняет привязку учетной записи» .
- Настройте порядок действий, если пользователь не согласен связать свою учетную запись. Например, отправьте подтверждающее сообщение и перенаправьте на сцены, которые предоставляют функциональные возможности, не требующие привязки учетной записи.
- Нажмите Сохранить .
- В разделе «Условия» выберите «При возникновении системной или сетевой ошибки» .
- Настройте, как должен действовать процесс, если процесс связывания учетных записей не может быть завершен из-за системных или сетевых ошибок. Например, отправьте подтверждающее сообщение и перенаправьте на сцены, которые предоставляют функциональные возможности, не требующие привязки учетной записи.
- Нажмите Сохранить .
Доступ к информации профиля в вашем бэкэнде
После того как пользователь разрешит ваше действие для доступа к своему профилю Google, вы получите токен Google ID, который будет содержать информацию о профиле Google пользователя в каждом последующем запросе вашего действия.
Чтобы получить доступ к информации профиля пользователя, вам необходимо сначала проверить и декодировать токен, выполнив следующие действия:
- Используйте библиотеку декодирования JWT для вашего языка для декодирования токена и используйте открытые ключи Google (доступные в формате JWK или PEM ) для проверки подписи токена.
- Убедитесь, что эмитент токена (поле
iss
в декодированном токене) —https://accounts.google.com
, а аудитория (полеaud
в декодированном токене) — это значение идентификатора клиента, выданного Google для ваших действий , то есть назначенный вашему проекту в консоли действий.
Ниже приведен пример декодированного токена:
{
"sub": 1234567890, // The unique ID of the user's Google Account
"iss": "https://accounts.google.com", // The token's issuer
"aud": "123-abc.apps.googleusercontent.com", // Client ID assigned to your Actions project
"iat": 233366400, // Unix timestamp of the token's creation time
"exp": 233370000, // Unix timestamp of the token's expiration time
"name": "Jan Jansen",
"given_name": "Jan",
"family_name": "Jansen",
"email": "jan@gmail.com", // If present, the user's email address
"locale": "en_US"
}
Если вы используете библиотеку Actions on Google Fulfillment для Node.js , она позаботится о проверке и декодировании токена за вас и предоставит вам доступ к содержимому профиля, как показано в следующих фрагментах кода.
...
const app = conversation({
// REPLACE THE PLACEHOLDER WITH THE CLIENT_ID OF YOUR ACTIONS PROJECT
clientId: CLIENT_ID,
});
...
// Invoked on successful completion of account linking flow, check if we need to
// create a Firebase user.
app.handle('linkAccount', async conv => {
let payload = conv.headers.authorization;
if (payload) {
// Get UID for Firebase auth user using the email of the user
const email = payload.email;
if (!conv.user.params.uid && email) {
try {
conv.user.params.uid = (await auth.getUserByEmail(email)).uid;
} catch (e) {
if (e.code !== 'auth/user-not-found') {
throw e;
}
// If the user is not found, create a new Firebase auth user
// using the email obtained from Google Assistant
conv.user.params.uid = (await auth.createUser({email})).uid;
}
}
}
});
Обработка запросов на доступ к данным
Чтобы обработать запрос на доступ к данным, просто убедитесь, что пользователь, подтвержденный токеном идентификатора Google, уже присутствует в вашей базе данных. В следующем фрагменте кода показан пример того, как проверить, существуют ли уже заказы для пользователя в базе данных Firestore:
...
app.handle('Place_Order', async conv => {
const order = conv.session.params.order;
const userDoc = dbs.user.doc(conv.user.params.uid);
const orderHistory = userDoc.collection("orderHistory");
if (orderHistory) {
// Order history exists, so the user already placed an order.
// Update counter for order type.
await orderHistory.doc(order).update({ count: admin.firestore.FieldValue.increment(1)});
} else {
// First order they place
await orderHistory.doc(order).set({ option: order, count: 1});
options.forEach(opt => {
if (opt != order) {
orderHistory.doc(opt).set({ option: opt, count: 0});
}
});
}
return conv.add(`Your ${order} has been placed. ` +
'Thanks for using Boba Bonanza, see you soon!');
});