Пользователь вошел в систему, но его полезная нагрузка дает "неопределенный" в результате - PullRequest
0 голосов
/ 20 января 2019

Я работаю с Dialog Flow и мне нужно получить идентификатор пользователя (точнее, уникальный идентификатор пользователя).Приложение Google Assistant отлично подходит для входа в систему, но когда я пытаюсь получить уникальный идентификатор, в результате я получаю "undefined".

Я много раз искал в Google, но не смог найти ответ.

Моё приложение Google Assistant изначально позволяет пользователю войти в систему, затем использует его Уникальный идентификатор в качестве идентификатора базы данных Firebase, сохраняет его данные в полях (например, детали заказа, детали оплаты и т. Д.,) И показывает их, когда пользовательвызывает намерение, связанное с этим.

Я уже объявил сущности и Интенты, которые были указаны в выполнении.

index.js Выполнения -------------------------------

'use strict';

const functions = require('firebase-functions');
const {WebhookClient} = require('dialogflow-fulfillment');
const {Card, Suggestion} = require('dialogflow-fulfillment');
const {
  dialogflow,
  SignIn
} = require("actions-on-google");
process.env.DEBUG = 'dialogflow:debug';
const admin = require('firebase-admin');
admin.initializeApp();
const db = admin.firestore();

exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
  const agent = new WebhookClient({ request, response });
  console.log('Dialogflow Request headers: ' + JSON.stringify(request.headers));console.log('Dialogflow Request body: ' + JSON.stringify(request.body));

  const app = dialogflow({
    clientId:'<CLIENT ID>'
  });

  app.intent("Sign in user", conv => {
    conv.ask(new SignIn("To personalize"));
  });

  var payload;

  app.intent('Get Signin', (conv, params, signin) => {
      if (signin.status === 'OK') {
        payload = conv.user.profile.payload;
      }
    }
  );


  function welcome(agent) {
    let conv = agent.conv();
    var name = conv.user.access.token;
    agent.add(`Welcome to the Bot ${name}! How can I help?`);
  }

  function fallback(agent) {
    agent.add(`I didn't understand`);
    agent.add(`I'm sorry, can you try again?`);
  }
  function getOrderDetails(agent) {
    const dbRef = db.collection('users').doc("test");
    return dbRef.get()
      .then(doc => {
        if (!doc.exists) {
          agent.add('No data found in the database!');
        } else {
          agent.add("Your order status is "+doc.data().orderStatus);
        }
        return Promise.resolve('Read complete');
      });
  }

  function getPaymentDetails(agent) {
    const dbRef = db.collection('users').doc("test");
    return dbRef.get()
      .then(doc => {
        if (!doc.exists) {
          agent.add('No data found in the database!');
        } else {
          agent.add("Your payment is "+doc.data().paymentStatus);
        }
        return Promise.resolve('Read complete');
      });
  }

  function getDeliveryDetails(agent) {
    const dbRef = db.collection('users').doc("test");
    return dbRef.get()
      .then(doc => {
        if (!doc.exists) {
          agent.add('No data found in the database!');
        } else {
          agent.add("Your delivery Status is "+doc.data().deliveryDetails);
        }
        return Promise.resolve('Read complete');
      });
  }


  function getAllDetails(agent) {
    const dbRef = db.collection('users').doc("test");
    return dbRef.get()
      .then(doc => {
        if (!doc.exists) {
          agent.add('No data found in the database!');
        } else {
          agent.add("Delivery details" + doc.data().deliveryDetails + "\nOrder Status " + doc.data().orderStatus + "\nPayment Details " + doc.data().paymentStatus);
        }
        return Promise.resolve('Read complete');
      });
  }

  let intentMap = new Map();
  intentMap.set('Default Welcome Intent', welcome);
  intentMap.set('Default Fallback Intent', fallback);
  intentMap.set('GetDeliveryStatus', getDeliveryDetails);
  intentMap.set('GetPaymentDetails', getPaymentDetails);
  intentMap.set('GetOrderDetails', getOrderDetails);
  agent.handleRequest(intentMap);
});

1 Ответ

0 голосов
/ 22 января 2019

Если честно, у меня возникают проблемы с выяснением того, как работает ваш код и как вы отправляете запрос на вход.

Вы странным образом смешиваете библиотеку действий на Google и библиотеки выполнения диалогового окна, настраиваете большинство обработчиков намерений для работы с библиотекой выполнения диалогового окна и двумя входами, связанными с работать с библиотекой Actions-on-Google.

Однако , вы не настраиваете библиотеку a-o-g, которая будет запускаться webhook (потому что вы настраиваете библиотеку d-f для этого), поэтому эти Intents никогда не вызываются. Так что это не может быть отправка входа. Таким образом, пользователь не входит в систему. Таким образом, поле user.profile никогда не заполняется.

Кроме того, поле conv.user.access.token устанавливается только в том случае, если вы используете метод OAuth для аутентификации пользователя, а не для входа в Google. Вы указали в своем комментарии выше, что вы не используете OAuth, поэтому вы никогда не должны видеть этот набор.

...