# #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. Спасибо! Это сработало, и я оставил отзыв о частичном объяснении.