Как правильно проверить токен при проверке подлинности Firebase

# #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() возвращает обещание. Спасибо, что поймали его