Пользовательские утверждения Firebase, похоже, не работают

# #node.js #firebase #firebase-authentication #google-cloud-functions #google-admin-sdk

Вопрос:

У меня проблема с моим проектом — Node.js и Огневая база.

Я хочу добавить роль администратора, поэтому я использую пользовательские утверждения в соответствии с документами. У меня есть 3 функции в облачных функциях:

 exports.addAdminRole = functions.https.onCall((data, context) => {
  return admin.auth().setCustomUserClaims(context.auth.uid, {
    admin: true
  }).then(() =>'Success!')
    .catch(err => err)
})


exports.getUserRecord = functions.https.onCall((data, context) => {
  return admin.auth().getUser(context.auth.uid)
    .then(userRecord => userRecord.customClaims)
    .catch(err => err)
})


exports.deleteAdmin = functions.https.onCall((data, context) => {
  return admin.auth().setCustomUserClaims(context.auth.uid, null)
    .then(() => 'Deleted admin!')
    .catch(err => err)
})
 

Я вызываю функции непосредственно в клиенте (вызываемый http), и addAdminRole возвращает «Успех!» и, похоже, работает. getUserRecord, похоже, тоже работает и возвращает {admin: true} в соответствии с моими пользовательскими требованиями.

Теперь перейдем к проблеме. Я определил функцию для получения пользовательских утверждений на стороне клиента, как указано в документах:

 getRecords() {
      firebaseInstance.auth.currentUser.getIdTokenResult()
      .then(idTokenResult => {console.log("ADMIN:", idTokenResult)})
      .catch(err => console.error(err))
    }
 

(firebaseInstance импортируется и отлично работает во всем проекте)

Я не понимаю, почему, но код на стороне клиента возвращает объект со свойством claims, но у этого свойства нет утверждения администратора, которое я добавил в облачные функции.

если я попытаюсь получить доступ idTokenResult.claims.admin , как в документах, он зарегистрирует меня НЕОПРЕДЕЛЕННЫМ.

Ссылка на документы — https://firebase.google.com/docs/auth/admin/custom-claims#node.js

Не могли бы вы объяснить мне, в чем дело? Спасибо вам за вашу помощь!

Ответ №1:

Утверждения пользователя хранятся в его идентификационном токене, который автоматически обновляется SDK каждый час.

Установка пользовательского утверждения для профиля пользователя из пакета SDK администратора не приводит к автоматическому обновлению маркера идентификатора клиентов, поэтому может потребоваться до часа, прежде чем утверждение появится в клиентах. Документация намекает на это с:

Как только последние утверждения будут распространены на идентификационный токен пользователя, вы можете получить их, получив идентификационный токен: …

Однако эта документация может быть более четкой, поэтому я бы рекомендовал оставить отзыв с помощью кнопки внизу этой страницы.

Чтобы гарантировать, что утверждение будет передано клиенту раньше, вы должны заставить клиента обновить свой маркер идентификатора (например, передав true в getIdTokenResult() .

Комментарии:

1. Спасибо! Это сработало, и я оставил отзыв о частичном объяснении.