【问题标题】:Get current users access token from Firebase in React Native在 React Native 中从 Firebase 获取当前用户访问令牌
【发布时间】:2019-08-23 13:08:42
【问题描述】:

我正在尝试在 React Native 应用程序中获取 Firebase 身份验证访问令牌,以便我可以对自定义服务器的 API 调用进行身份验证。 Firebase 文档说我应该使用auth().currentUser.getIdToken(); 来获取这个令牌,但是 currentUser 返回null

我尝试在应用程序的多个区域使用getIdToken()。我知道访问令牌是生成的,因为我可以在使用 expo (user.stsTokenManager.accessToken) 时在日志中看到它。

为什么currentUser 会返回null,我怎样才能得到accessToken

【问题讨论】:

    标签: firebase api react-native firebase-authentication


    【解决方案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;
          });
        }
      });
    

    【讨论】:

    • 如何将 idToken 传递给函数?似乎变空了。
    • 有同样的问题。如何将 idToken 传递给保存我的 API 调用的单独函数?
    • 只需在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])
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-02-23
          • 2020-10-29
          • 2017-04-06
          • 2022-10-13
          • 2014-09-04
          • 2023-03-22
          相关资源
          最近更新 更多