Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.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 Nuxt新手-Firebase身份验证无法刷新_Javascript_Firebase_Vue.js_Nuxt.js - Fatal编程技术网

Javascript Nuxt新手-Firebase身份验证无法刷新

Javascript Nuxt新手-Firebase身份验证无法刷新,javascript,firebase,vue.js,nuxt.js,Javascript,Firebase,Vue.js,Nuxt.js,我已经搜索和尝试了大量的例子和不同的东西,但仍然完全停留在这里-我已经在这个问题上扯了两天的头发了… 我有一个常见的ish问题,如果我登录并单击链接,我的应用程序工作正常,但如果我刷新或直接在浏览器中点击URL,Firebase似乎认为我没有经过身份验证的会话 编辑因此,在仔细考虑之后,我认为这是因为刷新时,Vue服务器正在发出请求。单击链接时,客户端发出请求。。。最大的区别在于没有在服务器请求上设置或发送会话/cookie。 触发重定向的解决方案是什么?或者,是否有一种方法可以在加载页面时发送

我已经搜索和尝试了大量的例子和不同的东西,但仍然完全停留在这里-我已经在这个问题上扯了两天的头发了… 我有一个常见的ish问题,如果我登录并单击链接,我的应用程序工作正常,但如果我刷新或直接在浏览器中点击URL,Firebase似乎认为我没有经过身份验证的会话

编辑因此,在仔细考虑之后,我认为这是因为刷新时,Vue服务器正在发出请求。单击链接时,客户端发出请求。。。最大的区别在于没有在服务器请求上设置或发送会话/cookie。 触发重定向的解决方案是什么?或者,是否有一种方法可以在加载页面时发送浏览器的cookie/会话?还是在Vue和Firebase之间构建某种服务器到服务器身份验证,然后通过Vue/Vuex管理登录状态

这是FB返回的错误:

Error during getting LIST of presentations! FirebaseError: [code=permission-denied]: Missing or insufficient permissions. 
以下是我正在做的:

首先,在我的store/index.js中,我们对用户数据的cookie进行解码,并将其发送给一个名为setUserLoggedIn的操作(我知道我已经将相同的值设置了两次,但为了完整性,将其保留在那里:)

此代码似乎按预期工作(即,它总是在Nuxt启动时执行。我们这样做是为了确保在执行任何操作之前,我们在Vuex存储中有来自cookie的用户数据)。它对cookie进行解码/将预期值发送给setUserLoggedin

从'@/helpers'导入{getUserFromCookie}
导出常量操作={
异步nuxtServerInit({dispatch},{req}){
const user=getUserFromCookie(请求)
log('此代码首先使用用户'+JSON.stringify(用户))触发)
如果(用户){
log('找到一个用户cookie-也许我们可以让他们登录')
等待调度('user/setUserLoggedin'{
电子邮件:user.email,
uid:user.user\u id,
thisUserid:user.user\u id
})
}
}
}
然后,我们通过2次变异将登录状态和用户详细信息提交回Vuex的状态,然后确认用户已使用Firebase登录:

setUserLoggedin({commit},用户){
提交('LOGIN_STATUS',true)
log(`重新确认登录用户对象为${JSON.stringify(user)}`)
提交(“登录用户”{
loginInstanceId:'a-key-to-track-each-login-session',
useruniqueid:user.thisUserid,
电子邮件地址:user.email,
uid:user.thisUserid
})
返回UserService.affirmLogin(用户)
},
最后,我尝试检查是否有与Firebase的会话(Firebase.auth().currentUser返回未定义)。使用其他Firebase命令来侦听状态更改或类似的内容也不会带来好运。。。事实上,我所尝试的一切都是空白

async affirmLogin(myuser){
const currentUser=wait firebase.auth().currentUser
console.table(当前用户)
},
我还设置了一个带有Firebase令牌的令牌

wait firebase
.auth()
.signInWithEmailAndPassword(user.emailaddress,user.password)
.然后(()=>{
firebase.auth().onAuthStateChanged(用户=>{
currentUser=user.uid
})
})
const token=await firebase.auth().currentUser.getIdToken(true)
set('access\u token',token)//将token保存在cookie中以用于服务器呈现
我已经尝试了一百万种不同的方法——从配置Vuex state/getter和Firebase命令,到评论代码的生命周期、调试等等。但是我无法找出这不起作用的原因。Firebase似乎在刷新时忽略或看不到任何现有会话,即使我有一个cookie,并且我认为Vuex存储中有数据

但是,如果我通过UI点击上面的路线(即,我点击affirmLogin,点击表单提交按钮)创建一个导航到的页面,它确实可以工作

我认为问题在于我的课程有点不对劲,但我就是看不出可能是什么。我也不确定Firebase在刷新时应该如何收集用户ID。我所看到的其他例子似乎“只是工作”,但不适合我:(非常感谢任何帮助


谢谢,我不知道Vue、Nuxt或Firebase,但我的第一个猜测是,在您要求Firebase返回当前用户时,它尚未完全初始化或诸如此类。Firebase文档似乎同意:

注意:由于auth对象尚未完成初始化,currentUser也可能为null。如果使用观察者跟踪用户的登录状态,则无需处理此情况

您是否尝试过使用身份验证状态观测器?它看起来如下:

firebase.auth().onAuthStateChanged(function(user) {
  if (user) {
    // User is signed in.
  } else {
    // No user is signed in.
  }
});
setUserLoggedin({ commit }, user) {
  const userPromise = new Promise((resolve, reject) => {
    firebase.auth().onAuthStateChanged(function(user) {
      if (user) {
        // User is signed in.
        console.log('got user', user);
        resolve(true);
      } else {
        // No user is signed in.
        resolve(false);
      }
    });
  });

  commit('LOGIN_STATUS', true);

  console.log(`Re-affirming login user object is ${JSON.stringify(user)}`);
  commit('LOGIN_USER', {
    loginInstanceId: 'a-key-to-track-each-login-session',
    useruniqueid: user.thisUserid,
    emailaddress: user.email,
    uid: user.thisUserid,
  });

  return userPromise;
}
我建议尽早在代码中设置此选项,以确保您永远不会错过身份验证状态更改。您可以从以下内容开始:

firebase.auth().onAuthStateChanged(function(user) {
  if (user) {
    // User is signed in.
  } else {
    // No user is signed in.
  }
});
setUserLoggedin({ commit }, user) {
  const userPromise = new Promise((resolve, reject) => {
    firebase.auth().onAuthStateChanged(function(user) {
      if (user) {
        // User is signed in.
        console.log('got user', user);
        resolve(true);
      } else {
        // No user is signed in.
        resolve(false);
      }
    });
  });

  commit('LOGIN_STATUS', true);

  console.log(`Re-affirming login user object is ${JSON.stringify(user)}`);
  commit('LOGIN_USER', {
    loginInstanceId: 'a-key-to-track-each-login-session',
    useruniqueid: user.thisUserid,
    emailaddress: user.email,
    uid: user.thisUserid,
  });

  return userPromise;
}

我敢肯定,作为最终解决方案,这还不够好,但如果我的猜测是正确的,它可能会帮助您走上正确的道路。

我遇到了相同的问题,在刷新或重新加载后收到未经验证的错误,问题来自用户端点的
propertyName
,如果您直接返回用户,而不是使用对象
'user':{…}
,您应该在nuxt config的auth选项中放置
propertyName:false
,您可以通过直接执行此代码来检查auth将收到什么结果

let user = await this.$auth.requestWith(    
    'local',    //strategy name
    null,       //endpoint
    { url: '/api/user', method: 'get', propertyName: false } // options.endpoints.user
);

我认为你的
setUserLoggedin
操作也必须是异步的:
async setUserLoggedin…
然后在这个操作中:
return wait UserService.affirmLogin(user)
谢谢,但我担心这不起作用:(同样的错误再次感谢-这没有什么区别-我实际上也设置了(had!)(使用async/await)并且它似乎只解析为false。我不太确定我是否理解它是如何被假定的