#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])