Sohbet İşlemleri, 13 Haziran 2023'te kullanımdan kaldırılacak. Daha fazla bilgi için Görüşme İşlemleri'nin kullanımdan kaldırılması başlıklı makaleyi inceleyin.

Google ile Oturum Açma ile hesap bağlama

Koleksiyonlar ile düzeninizi koruyun İçeriği tercihlerinize göre kaydedin ve kategorilere ayırın.

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

İşleminiz sırasında kişiselleştirilmiş bir kullanıcı deneyimi oluşturmak için profil bilgileri kullanılabilir. Başka platformlarda uygulamalarınız varsa ve Google ile Oturum Açma özelliğini kullanıyorsanız mevcut bir kullanıcının hesabını bulup bu hesabın bağlantısını oluşturabilir, yeni bir hesap oluşturabilir ve kullanıcıyla doğrudan iletişim kurabileceğiniz bir kanal oluşturabilirsiniz.

Google ile Oturum Açma özelliğini kullanarak hesap bağlama işlemi gerçekleştirmek için kullanıcıdan Google profiline erişmesine izin 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 hesabı bağlama

İşleminize Google ile Oturum Açma hesabı bağlama özelliğini eklemek için aşağıdaki bölümlerde yer alan adımları uygulayın.

Projeyi yapılandırın

Projenizi Google ile Oturum Açma hesap bağlama özelliğini 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ştir sekmesini tıklayın ve Hesap bağlama'yı seçin.
  3. Hesap bağlama seçeneğinin 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. İstemci Bilgileri'ni açın ve Google tarafından İşlemlerinize verilen İstemci Kimliği değerini not edin.

  7. Kaydet'i tıklayın.

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

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

  1. Actions Console'da Actions Builder projenizi açın.
  2. İşleminizde hesap bağlama işlemini 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ış 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 gerçekleştiremez ve hesap bağlantısı gerektirmeyen işlevlere erişim sağlamalıdır.
    1. Koşul'un altındaki 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 sahneyi veya yalnızca konuk olarak kullanılabilen işlevin giriş noktası olan bir sahne 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'un altındaki Enter new expression alanına aşağıdaki mantığı girin: user.verificationStatus == "VERIFIED"
    2. Geçiş'in altında Hesap Bağlama sistem sahnesini seçin.
    3. Kaydet'i tıklayın.

Kaydetme işleminden sonra projenize <SceneName>_AccountLinking adlı yeni bir hesap bağlama sistemi sahnesi eklenir.

Hesap bağlama sahnesini özelleştir

  1. Sahneler altında, hesap bağlama sistemi sahnesini seçin.
  2. İstemi gönder'i tıklayın ve kullanıcıya İşlem'in kimliğine neden erişmesi gerektiğini 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ğlama işlemini 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şlemek ve kaynak sahneye geri dönmek için webhook'u çağırın.
  3. Kaydet'i tıklayın.

  1. Koşullar bölümünde, Kullanıcı hesap bağlama işlemini iptal eder veya kapatırsa'yı tıklayın.
  2. Kullanıcı, hesabını bağlamayı kabul etmezse akışın nasıl ilerleyeceğini yapılandırın. Örneğin, onay mesajı gönderin ve hesap bağlama 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 etmesi gerektiğini yapılandırın. Örneğin, onay mesajı gönderin ve hesap bağlama gerektirmeyen işlevler sunan sahnelere yönlendirin.
  3. Kaydet'i tıklayın.

Arka ucunuzdaki profil bilgilerine erişin

Kullanıcı, işlemin için Google profiline erişim yetkisi verdikten sonra, işlemin sonraki her isteğinde 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 jetonun kodunu çözmeniz gerekir:

  1. Jetonun kodunu çözmek için dilinizde bir JWT kod çözme kitaplığı kullanın ve jetonun imzasını doğrulamak üzere Google'ın ortak anahtarlarını (JWK veya PEM biçiminde) kullanın.
  2. Jetonu verenin (şifresi çözülmüş jetondaki iss alanı) https://accounts.google.com olduğunu ve kitlenin (şifresi çözülmüş jetondaki aud alanı), Actions konsolunda projenize atanan Google tarafından Action'larınıza verilen Client-ID'nin 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"
}

Actions.js için Google'daki İşlemlerin Tamamlanması Kitaplığı'nı kullanırsanız jeton doğrulama ve kod çözme işlemlerini sizin yerinize yapar 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 yönetme

Veri erişimi isteğini işlemek için Google Kimliği jetonuyla hak talebinde bulunulan kullanıcının veritabanınızda zaten bulunduğunu doğrulamanız yeterlidir. Aşağıdaki kod snippet'i, bir kullanıcının siparişlerinin zaten Firestore veritabanında bulunup bulunmadığını nasıl kontrol edeceğinizi gösteren bir örneği göstermektedir:

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