- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
本人还是nuxt初学者,如有不妥之处还请见谅
我正在为 nuxt 使用“官方”firebase 模块 https://firebase.nuxtjs.org/访问 Firebase 服务,例如 auth signIn 和 singOut。
这有效。
但是,我在通用模式下使用 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 存储中。
此获取方法使用 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 token 作为发送到 API 的 header 的一部分以进行授权。
当 fetch 方法运行时,状态并不总是改变或更新,因此在状态改变之前用户的状态仍然为 null,这通常是大约一秒钟之后,这对我来说是个问题因为我需要商店中的 token 才能进行 API 调用。
在我的 fetch 方法中调用 axios api 之前,如何等待 store.user 状态完成更新/不为空?
我考虑过在用户登录时使用 cookie 来存储此信息。然后,在 fetch 方法中,我可以使用 cookie 来获取 token ,而不必等待状态更改。我使用这种方法的问题是 cookie 在更新其 token 之前还需要等待状态更改,这意味着它将在初始页面加载时使用旧 token 。我可能仍会选择此解决方案,只是感觉这是处理此问题的错误方法。有没有更好的方法来处理此类难题?
此外,当在 fetch 中时,第一次加载将从服务器进行,因此我可以从 cookie 中获取 token ,但是下一次加载将从客户端进行,所以如果存储,我该如何检索 token 加载时值仍然为空?
我选择了 SPA 模式。经过长时间的深思熟虑,我真的不需要 nuxt 服务器,而且 SPA 模式具有“类似服务器”的行为,您仍然可以在页面呈现之前使用 asyncdata 和 fetch 来获取数据,中间件仍然工作类似,实际上是身份验证在不需要保持客户端和服务器与访问 token 等同步的情况下工作。我仍然希望在未来看到更好的解决方案,但现在 SPA 模式工作正常。
最佳答案
我在寻找类似问题的解决方案时遇到了这个问题。在回答这个问题之前,我有一个与其他答案中提到的类似的解决方案,我正在寻找的是实现细节。
我使用 nuxt.js,我想到的第一个方法是制作一个 layout
组件并渲染 <Nuxt/>
仅当用户通过身份验证时才执行指令,但通过这种方法,我只能拥有一个布局文件,如果我有多个布局文件,我将不得不在每个布局中实现相同的预授权机制,尽管这是可行的- 像现在一样我不是在每个页面中实现它,而是在每个布局中实现它应该少得多。
我找到了一个更好的解决方案,那就是使用 middlewares
在 nuxt 中,您可以返回一个 promise 或使用 async-await 和中间件来停止应用程序安装过程,直到该 promise 得到解决。这是示例代码:
// middleware/auth.js
export default async function ({ store, redirect, $axios, app }) {
if (!store.state.auth) { // if use is not authenticated
if (!localStorage.getItem("token")) // if token is not set then just redirect the user to login page
return redirect(app.localePath('/login'))
try {
const token = localStorage.getItem("token");
const res = await $axios.$get("/auth/validate", { // you can use your firebase auth mechanism code here
headers: {
'Authorization': `Bearer ${token}`
}
});
store.commit('login', { token, user: res.user }); // now just dispatch a login action to vuex store
}
catch (err) {
store.commit('logout'); // preauth failed, so dispatch logout action which will clear localStorage and our Store
return redirect(app.localePath('/login'))
}
}
}
现在您可以在您的页面/布局组件中使用这个中间件,如下所示:
<template>
...
</template>
<script>
export default {
middleware: "auth",
...
}
</script>
关于firebase - NuxtJS 状态更改和 firebase 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60971705/
我正在使用SQL Server 2008 R2,并且想创建一个触发器。 对于每个添加(仅添加),将像这样更新一列: ABC-CurrentYear-AutoIncrementCode 例子: ABC-
是否可以在显示最终一致性的数据存储中创建/存储用户帐户? 似乎不可能在没有一堆架构复杂性的情况下管理帐户创建,以避免可能发生具有相同 UID(例如电子邮件地址)的两个帐户的情况? 最终一致性存储的用户
您好, 我有一个带有 Identity 的 .NetCore MVC APP并使用 this指导我能够创建自定义用户验证器。 public class UserDomainValidator : IU
这与以下问题相同:HiLo or identity? 我们以本站的数据库为例。 假设该站点具有以下表格: 帖子。 投票。 注释。 使用它的最佳策略是什么: 身份 - 这是更常见的。 或者 HiLo -
我想将 Blazor Server 与 ASP.NET Identity 一起使用。但我需要使用 PostgreSQL 作为用户/角色存储,因为它在 AWS 中。 它不使用 EF,这是我需要的。 我创
我正在开发一个 .NET 应用程序,它可以使用 Graph API 代表用户发送电子邮件。 提示用户对应用程序进行授权;然后使用获取的访问 token 来调用 Graph API。刷新 token 用
我使用 ASP.NET 身份和 ClaimsIdentity 来验证我的用户。当用户通过身份验证时,属性 User.Identity 包含一个 ClaimsIdentity 实例。 但是,在登录请求期
所以我在两台机器上都安装了 CYGWIN。 如果我这样做,它会起作用: ssh -i desktop_rsa root@remoteserver 这需要我输入密码 ssh root@remoteser
我尝试在 mac osx 上的终端中通过 telnet 连接到 TOR 并请求新身份,但它不起作用,我总是收到此错误消息: Trying 127.0.0.1... telnet: connect to
我正在开发一个 .NET 应用程序,它可以使用 Graph API 代表用户发送电子邮件。 提示用户对应用程序进行授权;然后使用获取的访问 token 来调用 Graph API。刷新 token 用
我正在开发一项服务,客户可以在其中注册他们的 webhook URL,我将发送有关已注册 URL 的更新。为了安全起见,我想让客户端(接收方)识别是我(服务器)向他们发送请求。 Facebook和 G
在 Haskell 中,有没有办法测试两个 IORef 是否相同?我正在寻找这样的东西: IORef a -> IORef a -> IO Bool 例如,如果您想可视化由 IORef 组成的图形,这
我是 .NET、MVC 和身份框架的新手。我注意到身份框架允许通过注释保护单个 Controller 操作。 [Authorize] public ActionResult Edit(int? Id)
我有一列具有身份的列,其计数为19546542,我想在删除所有数据后将其重置。我需要类似ms sql中的'dbcc checkident'这样的内容,但在Oracle中 最佳答案 在Oracle 12
这是我用来创建 session 以发送电子邮件的代码: props.put("mail.smtp.auth", "true"); props.put("mail.smtp.starttls.enabl
我想了解 [AllowAnonymous] 标签的工作原理。 我有以下方法 [HttpGet] public ActionResult Add() { return View(); } 当我没
在使用沙盒测试环境时,PayPal 身份 token 对某些人显示而不对其他人显示的原因是否有任何原因。 我在英国使用 API,终生无法生成或找到 token 。 我已经遵循协议(protocol)并
我对非常简单的事情有一些疑问:IDENTITY。我尝试在 phpMyAdmin 中创建表: CREATE TABLE IF NOT EXISTS typEventu ( typEventu
习语 #1 和 #5 是 FinnAPL Idiom Library两者具有相同的名称:“Progressive index of (without replacement)”: ((⍴X)⍴⍋⍋X⍳
当我第一次在 TFS 中设置时,我的公司拼错了我的用户名。此后他们将其更改为正确的拼写,但该更改显然未反射(reflect)在 TFS 中。当我尝试 checkin 更改时,出现此错误: 有没有一种方
我是一名优秀的程序员,十分优秀!