Google ile Oturum Açma ile hesap bağlama

Asistan için Google ile Oturum Açma, hem hesap bağlama hem de hesap oluşturma açısından kullanıcılara ve geliştiricilere en basit ve en kolay kullanıcı deneyimini sunar. İşleminiz görüşme sırasında kullanıcının Google profiline (kullanıcının adı, e-posta adresi ve profil resmi dahil) erişim isteğinde bulunabilir.

Profil bilgileri, İşleminizde kişiselleştirilmiş bir kullanıcı deneyimi oluşturmak için kullanılabilir. Başka platformlarda çalışan uygulamalarınız varsa ve bu uygulamalar Google ile Oturum Açma özelliğini kullanıyorsa mevcut bir kullanıcının hesabını bulup bağlayabilir, yeni hesap oluşturabilir ve kullanıcıyla doğrudan bir iletişim kanalı oluşturabilirsiniz.

Google ile Oturum Açma ile hesap bağlama işlemi gerçekleştirmek için kullanıcıdan Google profiline erişim izni vermesini istersiniz. Ardından, sisteminizdeki kullanıcıyı tanımlamak için kullanıcının profilindeki bilgileri (ör. e-posta adresi) kullanırsınız.

Google ile Oturum Açma hesap bağlantısını uygulayın

İşleminize Google ile Oturum Açma hesap bağlamasını eklemek için aşağıdaki bölümlerde yer alan adımları izleyin.

Projeyi yapılandırma

Projenizi Google ile Oturum Açma hesap bağlamayı kullanacak şekilde yapılandırmak için aşağıdaki adımları uygulayın:

  1. Actions Console'u açıp bir proje seçin.
  2. Geliştirme sekmesini tıklayın ve Hesap bağlama'yı seçin.
  3. Hesap bağlama'nın yanındaki anahtarı etkinleştirin.
  4. Hesap oluşturma bölümünde Evet'i seçin.
  5. Bağlantı türü bölümünde Google ile Oturum Açma'yı seçin.

  6. Müşteri Bilgileri'ni açın ve Google tarafından İşlemlerinize verilen İstemci Kimliği'nin değerini not edin.

  7. Kaydet'i tıklayın.

Kimlik doğrulama akışı için ses kullanıcı arayüzünü tasarlama

Kullanıcının doğrulanıp doğrulanmadığını kontrol etme ve hesap bağlama akışını başlatma

  1. Actions Console'da Actions Builder projenizi açın.
  2. İşleminizde hesap bağlamayı başlatmak için yeni bir sahne oluşturun:
    1. Sahneler'i tıklayın.
    2. Yeni bir sahne eklemek için ekle (+) simgesini tıklayın.
  3. Yeni oluşturulan sahnede Koşullar için ekle simgesini tıklayın.
  4. Görüşmeyle ilişkilendirilen kullanıcının doğrulanmış bir kullanıcı olup olmadığını kontrol eden bir koşul ekleyin. Kontrol başarısız olursa İşleminiz görüşme sırasında hesap bağlama işlemi gerçekleştiremez ve hesap bağlamayı gerektirmeyen işlevlere erişim sağlamaya devam etmelidir.
    1. Koşul bölümündeki Enter new expression alanına aşağıdaki mantığı girin: user.verificationStatus != "VERIFIED"
    2. Geçiş bölümünde, hesap bağlama gerektirmeyen bir düzen veya yalnızca konuklara özel işleve giriş noktası olan bir düzen seçin.

  1. Koşullar için ekle simgesini tıklayın.
  2. Kullanıcının ilişkili bir kimliği yoksa hesap bağlama akışını tetiklemek için bir koşul ekleyin.
    1. Koşul bölümündeki Enter new expression alanına aşağıdaki mantığı girin: user.verificationStatus == "VERIFIED"
    2. Geçiş bölümünde, Hesap Bağlama sistem sahnesini seçin.
    3. Kaydet'i tıklayın.

Kaydettikten sonra projenize <SceneName>_AccountLinking adlı yeni bir hesap bağlama sistemi düzeni eklenir.

Hesap bağlama sahnesini özelleştirin

  1. Sahneler bölümünde, hesap bağlama sistemi sahnesini seçin.
  2. İstem gönder'i tıklayın ve işlemin neden kimliğine erişmesi gerektiğini kullanıcıya açıklamak için kısa bir cümle ekleyin (örneğin, "Tercihlerinizi kaydetmek için").
  3. Kaydet'i tıklayın.

  1. Koşullar bölümünde, Kullanıcı hesap bağlamayı başarıyla tamamlarsa'yı tıklayın.
  2. Kullanıcı, hesabını bağlamayı kabul ederse akışın nasıl devam edeceğini yapılandırın. Örneğin, gerekli olan özel iş mantığını işlemesi ve kaynak sahneye geri dönmesi için webhook'u çağırın.
  3. Kaydet'i tıklayın.

  1. Koşullar bölümünde, Kullanıcı hesap bağlamayı iptal eder veya reddederse'yi tıklayın.
  2. Kullanıcı, hesabını bağlamayı kabul etmezse akışın nasıl devam edeceğini yapılandırın. Örneğin, onaylama mesajı gönderin ve kullanıcıları, hesap bağlamayı gerektirmeyen işlevler sunan sahnelere yönlendirin.
  3. Kaydet'i tıklayın.

  1. Koşullar bölümünde, Sistem veya ağ hatası oluşursa'yı tıklayın.
  2. Hesap bağlama akışı sistem veya ağ hataları nedeniyle tamamlanamıyorsa akışın nasıl devam edeceğini yapılandırın. Örneğin, onaylama mesajı gönderin ve kullanıcıları, hesap bağlamayı gerektirmeyen işlevler sunan sahnelere yönlendirin.
  3. Kaydet'i tıklayın.

Arka ucunuzda profil bilgilerine erişme

Kullanıcı, Google profiline erişmesi için işleminizi yetkilendirdikten sonra, işleminize yönelik her bir sonraki istekte kullanıcının Google profil bilgilerini içeren bir Google kimliği jetonu alırsınız.

Kullanıcının profil bilgilerine erişmek için önce aşağıdakileri yaparak jetonu doğrulamanız ve kodunu çözmeniz gerekir:

  1. Jetonun kodunu çözmek için dilinize yönelik bir JWT kod çözme kitaplığı, jetonun imzasını doğrulamak için ise Google'ın ortak anahtarlarını (JWK veya PEM biçiminde mevcuttur) kullanın.
  2. Jetonu verenin (kodu çözülmüş jetondaki iss alanı) https://accounts.google.com olduğunu ve kitlenin (kodu çözülmüş jetondaki aud alanı), Actions konsolunda projenize atanan Google tarafından İşlemler'inize verilen İstemci Kimliği değeri olduğunu doğrulayın.

Aşağıda kodu çözülmüş bir jeton örneği verilmiştir:

{
  "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"
}

Node.js için Actions on Google Fulfillment kitaplığı'nı kullanırsanız, jetonun doğrulanması ve kodunun çözülmesiyle ilgilenir ve aşağıdaki kod snippet'lerinde gösterildiği gibi profil içeriğine erişmenizi sağlar.

...
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;
      }
    }
  }
});

Veri erişim isteklerini işleme

Veri erişim isteğini işlemek için Google kimlik jetonu tarafından hak talebinde bulunulan kullanıcının veritabanınızda zaten mevcut olduğunu doğrulamanız yeterlidir. Aşağıdaki kod snippet'i, bir kullanıcının siparişlerinin zaten bir Firestore veritabanında olup olmadığını kontrol etmenin bir örneğini gösterir:

...
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!');
});