Получение токена доступа текущих пользователей из Firebase в React Native

#firebase #api #react-native #firebase-authentication

#firebase #API #react-native #firebase-аутентификация

Вопрос:

Я пытаюсь получить токен доступа для аутентификации Firebase в приложении React Native, чтобы я мог аутентифицировать свои вызовы API на пользовательском сервере. В документации Firebase говорится, что я должен получить этот токен, используя auth().currentUser.getIdToken(); однако CurrentUser возвращает null .

Я пытался использовать getIdToken() в нескольких областях приложения. Я знаю, что токен доступа генерируется, поскольку я вижу его в журналах при использовании expo (user.stsTokenManager.accessToken).

Почему currentUser возвращается null и как я могу получить accessToken ?

Ответ №1:

Вам нужно обернуть user.getIdToken() внутрь firebase.auth().onAuthStateChanged , чтобы user быть доступным. Затем вы можете использовать jwtToken в своем заголовке для аутентификации ваших вызовов API. Для этого необходимо импортировать файл конфигурации Firebase.

 let jwtToken = firebase.auth().onAuthStateChanged(function(user) {
    if (user) {
      user.getIdToken().then(function(idToken) {  // <------ Check this line
          alert(idToken); // It shows the Firebase token now
          return idToken;
      });
    }
  });
  

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

1. Как мне передать idToken функции? похоже, что становится нулевым.

2. Такая же проблема. Как мне передать idToken отдельной функции, которая поддерживает мой вызов API?

3. Просто вызовите функцию перед return инструкцией или set it in a state затем перейдите к любой функции или использованию then()

Ответ №2:

Простое указание await перед тоже будет работать точно так же:

await auth().currentUser.getIdToken();

Ответ №3:

getIdToken возвращает обещание

 firebase.auth()
        .signInWithCredential(credential)
        .then(async data => {
          const jwtToken = await data.user?.getIdToken();
          console.log(jwtToken);
        })
  

Ответ №4:

Пример подключения

К сожалению, напрямую получить токен ненадежно. Сначала вам нужно прослушать событие изменения состояния аутентификации, которое запускается при инициализации, поскольку оно асинхронное.

 import {auth} from '../utils/firebase'
import {useState, useEffect} from 'react'

export default function useToken() {
  const [token, setToken] = useState('')
  useEffect(() => {
    return auth().onAuthStateChanged(user => {
      if (user) {
        user.getIdToken(true)
        .then(latestToken => setToken(latestToken))
        .catch(err => console.log(err))
      }
    })
  }, [])
  return token
}
  

затем используйте подобное в своем функциональном компоненте

 
const token = useToken()

useEffect(() => {
  if (token) {
    // go wild
  }
}, [token])