Logowanie przez Google w Asystencie zapewnia użytkownikom i deweloperom najprostszy i najłatwiejszy sposób łączenia kont oraz tworzenia kont. Akcja może poprosić o dostęp do profilu Google użytkownika podczas rozmowy, w tym do jego nazwy, adresu e-mail i zdjęcia profilowego.
Informacje z profilu mogą służyć do personalizowania akcji. Jeśli masz aplikacje na innych platformach, które używają Logowania przez Google, możesz również znaleźć istniejące konto użytkownika i połączyć je z nim, utworzyć nowe konto oraz nawiązać bezpośredni kanał komunikacji z użytkownikiem.
Aby połączyć konto z logowaniem przez Google, musisz poprosić użytkownika o zgodę na dostęp do jego profilu Google. Informacje z profilu użytkownika, np. jego adres e-mail, pozwalają zidentyfikować użytkownika w swoim systemie.
Wdrażanie łączenia konta Log-In przez Google
Wykonaj czynności opisane w sekcjach poniżej, aby dodać do akcji połączenie z kontem Google Sign-In.
Konfigurowanie projektu
Aby skonfigurować projekt do korzystania z łączenia z kontem Logowanie przez Google, wykonaj te czynności:
- Otwórz Konsolę Actions i wybierz projekt.
- Kliknij kartę Programowanie i wybierz Łączenie kont.
- Włącz przełącznik obok opcji Łączenie kont.
- W sekcji Tworzenie konta wybierz Tak.
W sekcji Typ połączenia wybierz Logowanie przez Google.
Otwórz Informacje o kliencie i zwróć uwagę na wartość Identyfikatora klienta wydanego przez Google dla Działań.
Kliknij Zapisz.
Zaprojektuj interfejs głosowy pod kątem przepływu uwierzytelniania
Sprawdź, czy użytkownik został zweryfikowany, i rozpocznij proces łączenia kont
- Otwórz projekt Actions Builder w Konsoli Actions.
- Utwórz nową scenę, aby rozpocząć łączenie kont w Akcji:
- Kliknij Sceny.
- Aby dodać nową scenę, kliknij ikonę dodaj (+).
- W nowo utworzonej scenie kliknij ikonę dodawania add w sekcji Warunki.
- Dodaj warunek, który będzie sprawdzał, czy użytkownik powiązany z rozmową jest użytkownikiem zweryfikowanym. Jeśli sprawdzanie się nie powiedzie, akcja nie będzie mogła łączyć kont w trakcie rozmowy i powinna przyznać dostęp do funkcji, które nie wymagają łączenia kont.
- W polu
Enter new expression
w sekcji Warunek wpisz tę funkcję:user.verificationStatus != "VERIFIED"
- W sekcji Przejście wybierz scenę, która nie wymaga łączenia kont, ani scenę, która stanowi punkt wejścia do funkcji tylko dla gości.
- W polu
- Kliknij ikonę dodawania add obok pozycji Warunki.
- Dodaj warunek aktywujący proces łączenia kont, jeśli użytkownik nie ma powiązanej tożsamości.
- W polu
Enter new expression
w sekcji Warunek wpisz tę funkcję:user.verificationStatus == "VERIFIED"
- W sekcji Przenoszenie wybierz scenę systemową Łączenie kont.
- Kliknij Zapisz.
- W polu
Po zapisaniu do projektu zostanie dodana nowa scena systemu łączenia kont o nazwie <SceneName>_AccountLinking
.
Dostosowywanie sceny łączenia kont
- W sekcji Sceny wybierz scenę systemową łączenia kont.
- Kliknij Wyślij prośbę i dodaj krótkie zdanie opisujące użytkownikowi, dlaczego akcja musi uzyskać dostęp do jego tożsamości (np. „Aby zapisać Twoje ustawienia”).
- Kliknij Zapisz.
- W sekcji Warunki kliknij Jeśli użytkownik ukończy łączenie kont.
- Skonfiguruj sposób postępowania, jeśli użytkownik zgodzi się na połączenie swojego konta. Możesz na przykład wywołać webhooka, aby przetworzyć dowolną niezbędną niestandardową logikę biznesową i przejść z powrotem do sceny źródłowej.
- Kliknij Zapisz.
- W sekcji Warunki kliknij Jeśli użytkownik anuluje lub odrzuci łączenie kont.
- Skonfiguruj sposób postępowania, jeśli użytkownik nie zgadza się na połączenie swojego konta. Możesz na przykład wysłać wiadomość z potwierdzeniem i przekierować użytkownika do scen, które udostępniają funkcje, które nie wymagają łączenia kont.
- Kliknij Zapisz.
- W sekcji Warunki kliknij W przypadku wystąpienia błędu systemu lub sieci.
- Skonfiguruj proces, jeśli nie można go ukończyć z powodu błędów systemu lub sieci. Możesz na przykład wysłać wiadomość z potwierdzeniem i przekierować użytkownika do scen, które udostępniają funkcje, które nie wymagają łączenia kont.
- Kliknij Zapisz.
Uzyskiwanie dostępu do informacji o profilu w backendzie
Gdy użytkownik zezwoli akcji na dostęp do jego profilu Google, otrzymasz token tożsamości Google zawierający informacje z profilu Google tego użytkownika w przypadku każdego kolejnego żądania wykonania Twojego działania.
Aby uzyskać dostęp do informacji o profilu użytkownika, musisz najpierw zweryfikować i zdekodować token. Aby to zrobić:
- Do dekodowania tokena użyj biblioteki dekodowania JWT w swoim języku i kluczy publicznych Google (dostępnych w formacie JWK lub PEM) do zweryfikowania podpisu tokena.
- Sprawdź, czy wydawca tokena (pole
iss
w zdekodowanym tokenie) tohttps://accounts.google.com
, a grupa odbiorców (poleaud
w zdekodowanym tokenie) to wartość identyfikatora klienta wydanego przez Google do działań, który jest przypisany do Twojego projektu w konsoli Actions.
Oto przykład zdekodowanego tokena:
{ "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" }
Jeśli używasz biblioteki realizacji zamówień w Actions on Google dla środowiska Node.js, usługa ta weryfikuje i dekoduje token za Ciebie oraz zapewnia dostęp do treści profilu, jak widać w poniższych fragmentach kodu.
... 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; } } } });
Obsługiwanie próśb o dostęp do danych
Aby obsłużyć żądanie dostępu do danych, wystarczy sprawdzić, czy użytkownik wskazany przez token identyfikatora Google znajduje się już w bazie danych. Poniższy fragment kodu zawiera przykład sprawdzania, czy zamówienia użytkownika już istnieją w bazie danych 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!'); });