Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Firebase JS SDK中会话令牌的显式更新_Javascript_Reactjs_Firebase_Firebase Authentication - Fatal编程技术网

Javascript Firebase JS SDK中会话令牌的显式更新

Javascript Firebase JS SDK中会话令牌的显式更新,javascript,reactjs,firebase,firebase-authentication,Javascript,Reactjs,Firebase,Firebase Authentication,我已经使用Firebase Auth为以下几个提供程序实现了signin方法: firebase.auth().setPersistence(firebase.auth.Auth.Persistence.LOCAL).then(() => { let provider = new firebase.auth.GoogleAuthProvider(); // + facebook, gitHub provider.addScope('profile'); provider.add

我已经使用Firebase Auth为以下几个提供程序实现了signin方法:

firebase.auth().setPersistence(firebase.auth.Auth.Persistence.LOCAL).then(() => {
  let provider = new firebase.auth.GoogleAuthProvider(); // + facebook, gitHub
  provider.addScope('profile');
  provider.addScope('email');
  firebase.auth().signInWithPopup(provider).then(result => {
    // app logic here
然而,这段代码给了我60分钟的持续会话,我想学习如何自动更新当前用户会话,而不必被迫每小时登录一次

我还使用此代码“侦听”当前用户会话状态

firebase.auth().onAuthStateChanged(user => if (!user) //goto LoginPage
但它本身并不“监听”,它只在我尝试导航或更新页面时起作用。因此,我不知道如何使用Firebase方法限制访问的确切时间(例如,最多15分钟)

文档中说有一个
getIdToken
方法,但是我不知道在哪里使用这个代码。它应该在到期前每60分钟调用一次,还是应该在登录时设置?请给出一些提示或任何关于这种情况的教程

编辑: 另外,在一段时间的不活动之后(我认为不到1小时),我在控制台中得到了这段代码:


你好,首先我要为我的英语不好说声对不起。我不太了解firebase,但我认为如果你写这样的东西,它应该会起作用:

firebase.auth().setPersistence(firebase.auth.Auth.Persistence.SESSION).then(() => {
let provider = new firebase.auth.GoogleAuthProvider(); // + facebook, gitHub
provider.addScope('profile');
provider.addScope('email');
firebase.auth().signInWithPopup(provider).then(result => {
// app logic here

我的意思是,您应该使用firebase.auth.auth.Persistence.SESSION代替本地

将firebase令牌设置为在60分钟后过期。然后它会自动为您刷新。没有办法配置过期时间,您不需要在前端代码中为此做任何特殊的操作

唯一的诀窍是,您需要授予应用程序API密钥使用令牌服务API的权限,以便能够在令牌过期后为您创建新的id令牌。这是在GCP控制台、API和服务(凭证)中完成的

因此,代码应该很简单,如下所示

  • 添加用户

  • 实现登录逻辑

    
    fbAuth.setPersistence(firebase.auth.Auth.Persistence.LOCAL)
     .then(() => {
        return fbAuth.signInWithEmailAndPassword(email, password)
            .then(userCredential => {
                // Login success path
            })
            .catch(error => {
                // Login error path
            });
     })
     .catch(error => {
        // Persistence setting error path
     })
    
  • 您可以在登录之前设置身份验证状态持久性,具体取决于您的用例

  • 确保您的应用程序API密钥可以访问GCP控制台中的令牌服务API 这是在 GCP控制台| API和服务| 然后编辑部署环境的相应密钥,以授予API密钥对令牌服务API的访问权

  • 祝你好运;)

    你能详细说明一下你的答案吗?因为官方文件上说,
    会话
    只持续到选项卡打开为止。抱歉,我真的不知道firebase是什么,所以我在谷歌上搜索了如何保持登录,它说这样做
    会话
    不起作用,关闭选项卡会擦除会话,您必须再次登录。firebase会话是不确定的。通常情况下,让用户无需任何操作即可登录不会有任何问题。尝试刷新ID令牌时,您必须遇到其他问题。请提供有关您遇到的403错误的更多信息。
    
    fbAuth.onAuthStateChanged(user => {
      if (user) {
        // User is logged in
        // Proceed with your logged in user logic
      } else {
        // USer is not logged in
        // Redirect to the login page
      }
    })
    
    
    fbAuth.setPersistence(firebase.auth.Auth.Persistence.LOCAL)
     .then(() => {
        return fbAuth.signInWithEmailAndPassword(email, password)
            .then(userCredential => {
                // Login success path
            })
            .catch(error => {
                // Login error path
            });
     })
     .catch(error => {
        // Persistence setting error path
     })