Google Sign-In для Assistant обеспечивает самый простой и легкий пользовательский интерфейс для пользователей и разработчиков как для связывания учетной записи, так и для создания учетной записи. Ваше действие может запросить доступ к профилю Google вашего пользователя во время разговора, включая имя пользователя, адрес электронной почты и изображение профиля.
Информация профиля может использоваться для создания персонализированного взаимодействия с пользователем в вашем действии. Если у вас есть приложения на других платформах и они используют вход через Google, вы также можете найти существующую учетную запись пользователя и связать ее, создать новую учетную запись и установить прямой канал связи с пользователем.
Чтобы выполнить привязку аккаунта к Google Sign-In, вы просите пользователя дать согласие на доступ к его профилю Google. Затем вы используете информацию из их профиля, например адрес электронной почты, для идентификации пользователя в вашей системе.
Реализовать привязку аккаунта Google для входа
Выполните шаги, описанные в следующих разделах, чтобы добавить учетную запись Google для входа, связанную с вашим действием.
Настроить проект
Чтобы настроить проект для использования привязки аккаунта Google Sign-In, выполните следующие действия:
- Откройте консоль действий и выберите проект.
- Перейдите на вкладку «Разработка» и выберите «Привязка учетной записи» .
- Включите переключатель рядом с Привязкой аккаунта .
- В разделе Создание учетной записи выберите Да .
В типе связи выберите Google Sign In .
Откройте информацию о клиенте и обратите внимание на значение идентификатора клиента, выданного Google для ваших действий .
Нажмите Сохранить .
Разработайте голосовой пользовательский интерфейс для потока аутентификации
Проверьте, проверен ли пользователь, и запустите процесс привязки учетной записи.
- Откройте проект Actions Builder в консоли действий .
- Создайте новую сцену, чтобы начать привязку учетной записи в своем действии:
- Щелкните Сцены .
- Щелкните значок добавления (+), чтобы добавить новую сцену.
- В только что созданной сцене щелкните значок 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 ID, уже присутствует в вашей базе данных. В следующем фрагменте кода показан пример того, как проверить, существуют ли уже заказы для пользователя в базе данных 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!'); });