Являются ли fcmTokens и ID Tokens одинаковыми и как проверить их с помощью Node.js в качестве облачной функции? - PullRequest
0 голосов
/ 23 апреля 2020

Мое приложение использует fcmTokens, назначенные пользователю и сохраненные в документе Firestore, для отслеживания установок приложения и входов в систему. Когда пользователь выходит из приложения, я удаляю fcmToken из документа Firestore и запускаю InstanceID.instanceID().deleteID.

Однако, когда у пользователя неправильный inte rnet 'InstanceID.instanceID (). DeleteID' запускается снова, когда приложение запускается в следующий раз. В этом случае fcmToken в документе Firestore не удаляется. Теоретически я мог бы также выполнить запрос в приложении и найти этот токен во всех пользовательских документах Firestore и удалить его там, но я бы предпочел использовать облачные функции, чтобы проверить, действительны ли fcmTokens пользователя. Если нет, я хочу удалить их. Я начал писать следующую облачную функцию, но получаю сообщение о том, что

Не удалось расшифровать маркер Firebase ID. Убедитесь, что вы передали всю строку JWT, которая представляет собой идентификатор токена. См. https://firebase.google.com/docs/auth/admin/verify-id-tokens для получения подробной информации о том, как получить идентификационный токен.

Я предполагаю, что я использую неправильную функцию, и fcmTokens не совпадают с идентификационными токенами? Есть ли способ проверить действительность fcmToken, аналогично тому, как я проверяю здесь (несуществующий) идентификатор токена. Или я должен каким-то образом использовать идентификаторы токенов вообще для управления указанным устройством c логином? (Я использую прослушиватель моментальных снимков, который прослушивает изменения fcmToken, и я выхожу из системы при удалении указанного c fcmToken.)

Вот моя облачная функция:

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();

var userA_UID = ""

exports.checkFcmToken = functions.firestore.document('registeredUsers/{userA_UID}').onUpdate(async (snapshot, context) => {

  userA_UID = context.params.userA_UID;

  const userInfo = await admin.firestore().collection('registeredUsers').doc(userA_UID).get();

  const fcmTokens = userInfo.data()['fcmTokens'];

  if (fcmTokens !== undefined) {
    if (fcmTokens.length > 0) {
      for (let fcmToken of fcmTokens) {
        checkToken(fcmToken)
      }
    }
  }

  function checkToken(fcmToken) {

    //will delete token from document array if invalid

    admin.auth().verifyIdToken(fcmToken)
      .then((decodedToken) => {
        let uid = decodedToken.uid;
        console.log(uid)
        throw new Error('Error!')
      }).catch((error) => {
        console.log(error)
      });
  }
})

1 Ответ

0 голосов
/ 23 апреля 2020

FCM-токены и ID-токены совершенно различны и не могут использоваться взаимозаменяемо.

  • Firebase Authentication ID-токены идентифицируют пользователя. Это означает, что если один и тот же пользователь вошел в систему на двух разных устройствах, у них есть токены идентификатора, идентифицирующие одного и того же пользователя.
  • Маркеры FCM (также называемые токенами идентификатора экземпляра) идентифицируют установку приложения. Если у вас есть два токена от двух разных устройств, между этими токенами нет ничего общего.

Токены FCM являются непрозрачными строками, и их невозможно проверить без вызова API FCM.

Когда вы отправляете сообщение на устаревший токен, API FCM отвечает с явным сообщением об ошибке. Идиоматический c способ сохранить ваш список токенов в чистоте - обработать это сообщение об ошибке и удалить устаревший токен, как показано в этом примере из репозитория Cloud Functions .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...