'Google साइन इन' के साथ खाता जोड़ना

Assistant के लिए Google साइन इन की सुविधा से, उपयोगकर्ताओं और डेवलपर को खाता लिंक करने और खाता बनाने के लिए आसान और आसान अनुभव मिलता है. आपकी सेट की गई कार्रवाई, बातचीत के दौरान आपके उपयोगकर्ता की Google प्रोफ़ाइल को ऐक्सेस करने का अनुरोध कर सकती है. इसमें उपयोगकर्ता का नाम, ईमेल पता, और प्रोफ़ाइल फ़ोटो शामिल है.

प्रोफ़ाइल की जानकारी का इस्तेमाल, आपकी सेट की गई कार्रवाई में पसंद के हिसाब से उपयोगकर्ता अनुभव देने के लिए किया जा सकता है. अगर दूसरे प्लैटफ़ॉर्म पर आपके ऐप्लिकेशन मौजूद हैं और वे 'Google साइन इन' का इस्तेमाल करते हैं, तो आप किसी मौजूदा उपयोगकर्ता का खाता ढूंढ सकते हैं और उसे लिंक कर सकते हैं. साथ ही, नया खाता बना सकते हैं और उनसे सीधे बातचीत कर सकते हैं.

'Google साइन इन' के साथ खाता लिंक करने के लिए, आप उपयोगकर्ता से उसकी Google प्रोफ़ाइल ऐक्सेस करने की सहमति देने के लिए कहते हैं. फिर अपने सिस्टम में उपयोगकर्ता को पहचानने के लिए, उसकी प्रोफ़ाइल में मौजूद जानकारी का इस्तेमाल करें, जैसे कि उनका ईमेल पता.

'Google साइन-इन' खाता लिंक करने की प्रोसेस लागू करना

अपनी कार्रवाई से 'Google साइन इन' खाता लिंक करने के लिए, नीचे दिए गए सेक्शन में दिया गया तरीका अपनाएं.

प्रोजेक्ट कॉन्फ़िगर करें

'Google साइन-इन' खाता लिंक करने की सुविधा का इस्तेमाल करने के लिए, अपने प्रोजेक्ट को कॉन्फ़िगर करने के लिए, यह तरीका अपनाएं:

  1. Actions Console खोलें और कोई प्रोजेक्ट चुनें.
  2. डेवलप करें टैब पर क्लिक करें और खाता लिंक करना चुनें.
  3. खाता लिंक करना के बगल में मौजूद स्विच को चालू करें.
  4. खाता बनाएं सेक्शन में, हां चुनें.
  5. लिंक करने का तरीका में, Google साइन इन चुनें.

  6. क्लाइंट की जानकारी खोलें और Google की ओर से आपकी कार्रवाइयों के लिए जारी किए गए क्लाइंट आईडी की वैल्यू नोट करें.

  7. सेव करें पर क्लिक करें.

पुष्टि करने के लिए, वॉइस यूज़र इंटरफ़ेस डिज़ाइन करें

यह पता करना कि उपयोगकर्ता की पुष्टि हो चुकी है या नहीं और खाता लिंक करने की प्रक्रिया शुरू करें

  1. Actions कंसोल में अपना Actions Builder प्रोजेक्ट खोलें.
  2. अपनी सेट की गई कार्रवाई में खाता लिंक करने की प्रोसेस शुरू करने के लिए, एक नया सीन बनाएं:
    1. सीन पर क्लिक करें.
    2. नया सीन जोड़ने के लिए, जोड़ें (+) आइकॉन पर क्लिक करें.
  3. नए सीन में, शर्तों के लिए, जोड़ें आइकॉन पर क्लिक करें.
  4. एक शर्त जोड़ें जो यह जांच करती है कि बातचीत से जुड़ा उपयोगकर्ता, पुष्टि किया गया उपयोगकर्ता है या नहीं. अगर जांच पूरी नहीं हो पाती, तो आपकी सेट की गई कार्रवाई, बातचीत के दौरान खाता लिंक नहीं कर पाएगी. साथ ही, इसे ऐसे फ़ंक्शन का ऐक्सेस देना होगा जिसके लिए खाता लिंक करने की ज़रूरत नहीं होती.
    1. शर्त वाले Enter new expression फ़ील्ड में, यह लॉजिक डालें: user.verificationStatus != "VERIFIED"
    2. ट्रांज़िशन में, ऐसा सीन चुनें जिसमें खाता लिंक करने की ज़रूरत न हो या कोई ऐसा सीन चुनें जो सिर्फ़ मेहमान के लिए उपलब्ध सुविधा के लिए शुरुआती पॉइंट हो.

  1. शर्तों के लिए, ' जोड़ें' आइकॉन पर क्लिक करें.
  2. अगर उपयोगकर्ता की पहचान से जुड़ी जानकारी नहीं है, तो खाता लिंक करने के फ़्लो को ट्रिगर करने के लिए कोई शर्त जोड़ें.
    1. शर्त वाले Enter new expression फ़ील्ड में, यह लॉजिक डालें: user.verificationStatus == "VERIFIED"
    2. ट्रांज़िशन में जाकर, खाता लिंक करना सिस्टम सीन चुनें.
    3. सेव करें पर क्लिक करें.

सेव करने के बाद, आपके प्रोजेक्ट में खाता लिंक करने वाला <SceneName>_AccountLinking नाम का एक नया सीन जोड़ा जाता है.

खाता लिंक करने के सीन को पसंद के मुताबिक बनाना

  1. सीन में जाकर, खाता लिंक करने वाले सिस्टम का सीन चुनें.
  2. सूचना भेजें पर क्लिक करें. इसके बाद, एक छोटा वाक्य जोड़कर उपयोगकर्ता को बताएं कि कार्रवाई को उनकी पहचान का ऐक्सेस क्यों चाहिए. उदाहरण के लिए, "आपकी प्राथमिकताएं सेव करने के लिए".
  3. सेव करें पर क्लिक करें.

  1. शर्तें सेक्शन में, अगर उपयोगकर्ता खाता लिंक करने की प्रोसेस पूरी कर लेता है पर क्लिक करें.
  2. अगर उपयोगकर्ता अपने खाते को लिंक करने की सहमति देता है, तो फ़्लो को कॉन्फ़िगर करना. उदाहरण के लिए, ज़रूरी किसी भी कारोबारी लॉजिक को प्रोसेस करने और मूल सीन पर वापस जाने के लिए वेबहुक को कॉल करें.
  3. सेव करें पर क्लिक करें.

  1. शर्तें सेक्शन में, अगर उपयोगकर्ता खाता जोड़ने की प्रोसेस को रद्द करता है या उसे खारिज करता है, तो उस पर क्लिक करें.
  2. अगर उपयोगकर्ता अपने खाते को लिंक करने के लिए सहमत नहीं है, तो फ़्लो कॉन्फ़िगर करें. उदाहरण के लिए, स्वीकार करने वाला मैसेज भेजें और उन सीन पर रीडायरेक्ट करें जिनमें ऐसी सुविधाएं दी गई हों जिनके लिए खाता लिंक करने की ज़रूरत न हो.
  3. सेव करें पर क्लिक करें.

  1. शर्तें सेक्शन में, अगर सिस्टम या नेटवर्क की गड़बड़ी होती है पर क्लिक करें.
  2. कॉन्फ़िगर करें कि अगर सिस्टम या नेटवर्क की गड़बड़ियों की वजह से खाता लिंक करने का फ़्लो पूरा नहीं हो पा रहा है, तो फ़्लो कैसे आगे बढ़ना चाहिए. उदाहरण के लिए, स्वीकार करने वाला मैसेज भेजें और उन सीन पर रीडायरेक्ट करें जिनमें ऐसी सुविधाएं दी गई हों जिनके लिए खाता लिंक करने की ज़रूरत न हो.
  3. सेव करें पर क्लिक करें.

बैकएंड में प्रोफ़ाइल की जानकारी ऐक्सेस करना

जब उपयोगकर्ता अपनी Google प्रोफ़ाइल को ऐक्सेस करने के लिए आपकी कार्रवाई को अनुमति दे देता है, तब आपको एक Google आईडी टोकन मिलेगा. इस टोकन में उपयोगकर्ता की Google प्रोफ़ाइल की जानकारी शामिल होती है. यह जानकारी, आपकी कार्रवाई के हर अनुरोध में शामिल होती है.

उपयोगकर्ता की प्रोफ़ाइल की जानकारी ऐक्सेस करने के लिए, आपको सबसे पहले यहां बताए गए तरीके से टोकन की पुष्टि और उसे डिकोड करना होगा:

  1. अपनी भाषा के लिए, JWT-डिकोडिंग लाइब्रेरी का इस्तेमाल करके, टोकन को डिकोड करें. साथ ही, टोकन के सिग्नेचर की पुष्टि करने के लिए, Google की सार्वजनिक कुंजियों (JWK या PEM फ़ॉर्मैट में उपलब्ध) का इस्तेमाल करें.
  2. पुष्टि करें कि टोकन जारी करने वाला (डीकोड किए गए टोकन में iss फ़ील्ड) https://accounts.google.com है. साथ ही, यह भी पुष्टि करें कि ऑडियंस (डीकोड किए गए टोकन में aud फ़ील्ड) Google की ओर से आपकी कार्रवाइयों के लिए जारी किए गए क्लाइंट आईडी की वैल्यू है, जो Actions कंसोल में आपके प्रोजेक्ट को असाइन की जाती है.

डिकोड किए गए टोकन का एक उदाहरण यहां दिया गया है:

{
  "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 के लिए Actions on Google Fulfillment लाइब्रेरी का इस्तेमाल किया है, तो यह आपके टोकन की पुष्टि और उसे डिकोड कर देगा. साथ ही, आपको प्रोफ़ाइल के कॉन्टेंट का ऐक्सेस मिल जाएगा, जैसा कि यहां दिए गए कोड स्निपेट में दिखाया गया है.

...
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 आईडी टोकन से जिस उपयोगकर्ता का दावा किया गया है वह पहले से ही आपके डेटाबेस में मौजूद है. कोड के नीचे दिए गए स्निपेट में एक उदाहरण दिया गया है, जिसमें यह पता लगाने का तरीका बताया गया है कि किसी 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!');
});