Łączenie kont z Logowaniem przez Google

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:

  1. Otwórz Konsolę Actions i wybierz projekt.
  2. Kliknij kartę Programowanie i wybierz Łączenie kont.
  3. Włącz przełącznik obok opcji Łączenie kont.
  4. W sekcji Tworzenie konta wybierz Tak.
  5. W sekcji Typ połączenia wybierz Logowanie przez Google.

  6. Otwórz Informacje o kliencie i zwróć uwagę na wartość Identyfikatora klienta wydanego przez Google dla Działań.

  7. Kliknij Zapisz.

Zaprojektuj interfejs głosowy pod kątem przepływu uwierzytelniania

Sprawdź, czy użytkownik został zweryfikowany, i rozpocznij proces łączenia kont

  1. Otwórz projekt Actions Builder w Konsoli Actions.
  2. Utwórz nową scenę, aby rozpocząć łączenie kont w Akcji:
    1. Kliknij Sceny.
    2. Aby dodać nową scenę, kliknij ikonę dodaj (+).
  3. W nowo utworzonej scenie kliknij ikonę dodawania w sekcji Warunki.
  4. 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.
    1. W polu Enter new expression w sekcji Warunek wpisz tę funkcję: user.verificationStatus != "VERIFIED"
    2. 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.

  1. Kliknij ikonę dodawania obok pozycji Warunki.
  2. Dodaj warunek aktywujący proces łączenia kont, jeśli użytkownik nie ma powiązanej tożsamości.
    1. W polu Enter new expression w sekcji Warunek wpisz tę funkcję: user.verificationStatus == "VERIFIED"
    2. W sekcji Przenoszenie wybierz scenę systemową Łączenie kont.
    3. Kliknij Zapisz.

Po zapisaniu do projektu zostanie dodana nowa scena systemu łączenia kont o nazwie <SceneName>_AccountLinking.

Dostosowywanie sceny łączenia kont

  1. W sekcji Sceny wybierz scenę systemową łączenia kont.
  2. 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”).
  3. Kliknij Zapisz.

  1. W sekcji Warunki kliknij Jeśli użytkownik ukończy łączenie kont.
  2. 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.
  3. Kliknij Zapisz.

  1. W sekcji Warunki kliknij Jeśli użytkownik anuluje lub odrzuci łączenie kont.
  2. 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.
  3. Kliknij Zapisz.

  1. W sekcji Warunki kliknij W przypadku wystąpienia błędu systemu lub sieci.
  2. 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.
  3. 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ć:

  1. 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.
  2. Sprawdź, czy wydawca tokena (pole iss w zdekodowanym tokenie) to https://accounts.google.com, a grupa odbiorców (pole aud 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!');
});