【发布时间】:2020-07-13 06:01:43
【问题描述】:
我还是新手,如有不足请见谅。
我正在使用 nuxt https://firebase.nuxtjs.org/ 的“官方”firebase 模块来访问 auth signIn 和 singOut 等 Firebase 服务。
这行得通。
但是,我在通用模式下使用 nuxt,我无法在我的页面获取函数中访问它。所以我的解决方案是将此信息保存在 vuex 存储中,并在它更改时更新它。
因此,一旦用户登录或 firebase 身份验证状态发生变化,vuex 存储中需要发生状态变化。
目前,当用户登录或 firebase 身份验证状态发生变化时,如果用户仍处于登录状态,我会将状态保存到我的商店,如下所示:
const actions = {
async onAuthStateChangedAction(state, { authUser, claims }) {
if (!authUser) {
// claims = null
// TODO: perform logout operations
} else {
// Do something with the authUser and the claims object...
const { uid, email } = authUser
const token = await authUser.getIdToken()
commit('SET_USER', { uid, email, token })
}
}
}
我还有一个设置状态的突变,一个获取状态和实际状态对象以及存储初始状态的getter:
const mutations = {
SET_USER(state, user) {
state.user = user
}
}
const state = () => ({
user: null
})
const getters = {
getUser(state) {
return state.user
}
}
我的问题是,在我的许多页面上,我使用 fetch 方法从 API 获取数据,然后将这些数据存储在我的 vuex 存储中。
这个 fetch 方法使用 axios 进行 api 调用,如下所示:
async fetch({ store }) {
const token = store.getters['getUser'] //This is null for a few seconds
const tempData = await axios
.post(
my_api_url,
{
my_post_body
},
{
headers: {
'Content-Type': 'application/json',
Authorization: token
}
}
)
.then((res) => {
return res.data
})
.catch((err) => {
return {
error: err
}
console.log('error', err)
})
store.commit('my_model/setData', tempData)
}
Axios 需要我的 firebase 用户 ID 令牌作为发送到 API 以进行授权的标头的一部分。
当 fetch 方法运行时,状态并不总是改变或更新,因此用户的状态在状态改变之前仍然为空,这通常是大约一秒钟后,这对我来说是个问题,因为我需要来自商店的令牌来进行我的 api 调用。
在我的 fetch 方法中调用我的 axios api 之前,如何等待 store.user 状态完成更新/不为空?
我曾考虑在用户登录时使用 cookie 来存储此信息。然后,在 fetch 方法中,我可以使用 cookie 来获取令牌,而不必等待状态更改。这种方法的问题是 cookie 在更新它的令牌之前还需要等待状态更改,这意味着它将在初始页面加载时使用旧令牌。我可能仍会选择此解决方案,只是感觉这是处理此问题的错误方法。有没有更好的方法来处理这种类型的难题?
另外,当在 fetch 内部时,第一次加载将从服务器进行,所以我可以从 cookie 中获取令牌,但是下一次加载将来自客户端,那么我如何检索令牌然后如果存储加载时 value 仍然为 null 吗?
编辑:
我选择了 SPA 模式。经过长时间的深思熟虑,我真的不需要 nuxt 服务器,SPA 模式具有“类似服务器”的行为,您仍然可以在页面呈现之前使用 asyncdata 和 fetch 来获取数据,中间件仍然可以类似地工作并且实际上是身份验证可以在您不必使客户端和服务器与访问令牌等保持同步的情况下工作。我仍然希望在未来看到更好的解决方案,但现在 SPA 模式可以正常工作。
【问题讨论】:
-
您希望未经身份验证的用户访问您应用的任何部分吗?
-
只有登录页面,以后可能还有其他页面......
-
你试过 nuxt-fire 模块吗?它使在 nuxt 应用程序中处理 firebase 身份验证变得更加容易,并且对我们非常有用。
-
除此之外,是的,我做到了,这就是我正在使用的,请参阅上面我提到它的描述。它工作得很好,但是,我不知道他们的服务人员是如何工作的,我确实启用了它并将 SSR 模式设置为 true,但我无法访问 nuxt 服务器上的 fireauth 对象,以便从登录的 firebase 用户生成 idtoken。在多次尝试使用“hacky”方式将 cookie 数据传递到服务器后,我刚刚切换了通用模式,现在使用 SPA 模式,效果很好。
标签: firebase vue.js firebase-authentication nuxt.js