使用Nuxt中间件进行用户重定向和身份验证

时间:2018-10-08 06:39:34

标签: firebase vue.js nuxt

如果用户尝试使用以下代码访问某些页面时未登录,则我正在尝试将其重定向到登录页面。

require(panelAR)
panelAR(formula = formula ,data = data, panelVar = 'N', timeVar = 'T',
 panelCorrMethod = "pcse", autoCorr = "psar1", complete.case = T)

但是,当我刷新重定向到登录页面的页面时,此代码存在问题,尽管无需使用中间件,但我仍可以登录并停留在同一页面。由于某些原因,我不知道为什么,firebase无法在中间件中工作。

我应该如何修改此中间件或实现此功能?

谢谢。

// middlware/authenticated.js
import firebase from 'firebase'

export default function ({ store, redirect }) {
  let user = firebase.auth().currentUser   
  store.state.user = user //this doesn't work
  if (!user) {
    console.log('redirect')
    return redirect('/login')   
  }
}
//middleware/authenticated.js
export default function ({
  store,
  redirect
}) {
  if (!store.getters['index/isAuthenticated']) {
    return redirect('/login')
  }
}
//post.vue
  async mounted () {
    if (process.browser) {
      let user;
      if (!this.user) user = await auth(); // this auth is a plugin
      await Promise.all([
        this.user ? Promise.resolve() : this.$store.dispatch("setUser", { user: user || null })
      ]);
      this.isLoaded = true;
    }
  },

1 个答案:

答案 0 :(得分:0)

默认情况下,Firebase在成功进行身份验证后会保留用户的登录状态。此示例使用会话存储用户uid,并使用cookie存储用户令牌,并在会话结束(例如关闭浏览器)然后启动新会话但仍根据Firebase对用户进行身份验证的情况下使用。在这种情况下,用户无需登录即可查看受保护的资源。

用于保护它的基本中间件应如下所示(如果您有一个名为User的存储模块)

export default function ({ store, redirect }) {
  if (!store.getters['modules/user/isAuthenticated']) {
    return redirect('/auth/signin')
  }
}

your main Store you use the ServerInit Function中获取Cookie中是否保存了用户,并将其加载到您的用户存储模块中,该模块将在中间件中用于验证。

您的用户存储模块应外观为like this,并请记住,当您注销用户时,您将删除Cookie,以便其完全注销。

我将上面提到的内容用作身份验证的开始,并做了一些修改,您也可以这样做。大部分功劳归功于davidroyer,他建立了this nice Github Repo,其中包括了所有需要的文件,作为如何实现目标的一个很好的例子。