# #node.js #firebase-authentication #jwt #firebase-admin
Вопрос:
У меня есть собственное приложение React, которое успешно регистрирует пользователя по телефону через OTP с помощью Firebase. При входе в систему возвращаются следующие данные:
{«additionalUserInfo»: {«isNewUser»: ложь, «профиль»: null, «Идентификатор поставщика»: «телефон», «имя пользователя»: null}, «пользователь»: {«Имя дисплея»: null, «электронная почта»: null, «Проверено по электронной почте»: ложь, «isAnonymous»: ложь, «метаданные»: [Объект], «Номер телефона»: » 123456644″, «Фото»: null, «Данные поставщика»: [Массив], «Идентификатор поставщика»: «firebase», «Обновление»: «AFxQ4_reXvXb6-L_9SWC4SCHVqxl9Rv6zWDdC_BTXySuk-MOfbjrzc4WcrIwF7XqY0zkl-XT7eQtczt1jOg1HUDQ2-Nj6yDJWZRXOMuFKTn5Ddzj9mIz1Lxigmww0Lfo1-vmErUJ_-EX2JLMD7nqep6WhuOxOMtttXUaWy5XHIUgkgzN8fHJwS9sMV3Q0A8leTAkxURbp0zlw4-5SoRBu_a-EPHWsWAY-g», «TenantId»: null, «uid»: «Tx90EgWkSCf6M23KjsfH5Cf5vIv1»}}
Как вы можете видеть из приведенных выше данных, uid является Tx90EgWkSCf6M23KjsfH5Cf5vIv1
Чтобы проверить функцию verifyIdToken аутентификации Firebase, я затем использую указанный выше идентификатор uid и передаю его в методе:
admin
.auth()
.verifyIdToken('Tx90EgWkSCf6M23KjsfH5Cf5vIv1')
.then((decodedToken) => {
console.log('decodedToken', decodedToken)
})
.catch((error) => {
//Handle error
console.log('error', error)
})
Затем я получаю следующую ошибку:
errorInfo: {
code: 'auth/argument-error',
message: 'Decoding Firebase ID token failed. Make sure you passed the entire string JWT which represents an ID token. See https://firebase.google.com/docs/auth/admin/verify-id-tokens for details on how to retrieve an ID token.'
},
codePrefix: 'auth'
}
Как это исправить?
Ответ №1:
В verifyIdToken()
качестве параметра используется токен идентификатора пользователя, а не UID. Вы получаете идентификатор пользователя в объекте DecodedIdToken. Чтобы получить идентификатор пользователя в вашем приложении React Native, попробуйте это:
const token = await firebase.auth().currentUser.getIdToken();
Затем передайте этот токен на свой сервер и проверьте его. Вы не должны передавать удостоверение пользователя для проверки UID. Всегда проверяйте идентификационные маркеры.
Из документации,
Если ваше клиентское приложение Firebase взаимодействует с пользовательским внутренним сервером, вам может потребоваться идентифицировать текущего пользователя, вошедшего в систему на этом сервере. Чтобы сделать это безопасно, после успешного входа в систему отправьте идентификатор пользователя на свой сервер по протоколу HTTPS. Затем на сервере проверьте целостность и подлинность маркера идентификатора и извлеките из него идентификатор uid. Вы можете использовать uid, переданный таким образом, для безопасной идентификации текущего пользователя, вошедшего в систему на вашем сервере.
Вы можете прочитать больше об аутентификации на основе токенов здесь.
Комментарии:
1. Когда я регистрирую в консоли значение указанного выше токена, я получаю: {«_U»: 0, «_V»: 0, «_W»: null, «_X»: null}. Но приложение указывает, что пользователь подписал in….am Я что-то упустил?
2. токен const = ожидание аутентификации().Текущий пользователь.getIdToken();
3. требовалось ожидание…и, конечно, измените функцию включения на асинхронную
4. @престон да, я скучал по этому.
getIdToken()
возвращает обещание. Спасибо, что поймали его