我对Vue还比较陌生,这是我第一次使用Pinia。我正在按照this guide来设置Firebase、Pinia和Axios。我正在构建的应用使用FirebaseUI通过电子邮件链接登录用户, -这一切都发生在下面的LoginPage组件中:
(请忽略所有类型不正确的变量/函数-我只是想让它在第一时间工作)
<script setup lang="ts">
import { onMounted } from "vue";
import { EmailAuthProvider } from "firebase/auth";
import { auth } from "firebaseui";
import { auth as firebaseAuth } from "../firebase/config";
import { useUserStore } from "../stores/user"
onMounted(async () => {
const uiConfig: auth.Config = {
signInSuccessUrl: "/",
signInOptions: [
{
provider: EmailAuthProvider.PROVIDER_ID,
signInMethod: EmailAuthProvider.EMAIL_LINK_SIGN_IN_METHOD,
forceSameDevice: true,
},
],
callbacks: {
signInSuccessWithAuthResult: function (authResult) {
const store = useUserStore();
store.user = authResult;
return true;
},
},
};
const ui = new auth.AuthUI(firebaseAuth);
ui.start("#firebaseui-auth-container", uiConfig);
});
</script>
<template>
<div id="firebaseui-auth-container"></div>
</template>
当用户成功登录后,应用程序将更新Pinia商店的用户对象,使用signInSuccessWithAuthResult
函数返回的AuthResult对象。
{
additionalUserInfo: {...}
operationType: "signIn"
user: {
accessToken: "eyJhbGciOiJSUzI1N..."
auth: {...}
displayName: null
...
}
}
例如,正在存储accessToken
。用户存储如下:
import { defineStore } from 'pinia'
export const useUserStore = defineStore("userStore", {
state: () => ({
user: null as any
}),
getters: {
getUser(state) {
return state.user
}
}
})
在应用程序中,我设置了一个axios拦截器,它会将accessToken
附加到应用程序发出的任何Axios请求中:
axiosInstance.interceptors.request.use((config) => {
const userStore = useUserStore();
if (userStore) {
debugger;
// accessToken is undefined
config.headers.Authorization = 'Bearer ' + userStore.user.user.accessToken;
}
return config;
});
此时,当尝试从用户存储中检索accessToken
时,它已经不存在了。用户对象的大多数(如果不是全部)其他属性仍然存在,但访问令牌不存在,因此我非常确定我正确地使用了存储:
{
additionalUserInfo: {...}
credential: null
operationType: "signIn"
user: {
// accessToken is gone
apiKey: "..."
appName: "[DEFAULT]"
email: "..."
emailVerified: true
....
}
}
有人能解释一下我在哪里出了问题吗?为什么accessToken
被从存储中删除了?在我看来,我正确地使用了Pinia存储,而且我非常确定拦截器也是正确的。但是,很可能我以错误的方式存储了访问令牌。我希望得到任何关于如何使用Vue正确设置Firebase身份验证的帮助/建议。
- 已编辑,以便在拦截器内部进行两柴时包含使用者存放区的值。*
1条答案
按热度按时间insrf1ej1#
看起来accessToken可能在userStore中。user.user.accessToken?