axios 在Pinia存储中存储Firebase accessToken-Vue 3

fnvucqvd  于 2022-11-05  发布在  iOS
关注(0)|答案(1)|浏览(283)

我对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身份验证的帮助/建议。

  • 已编辑,以便在拦截器内部进行两柴时包含使用者存放区的值。*
insrf1ej

insrf1ej1#

看起来accessToken可能在userStore中。user.user.accessToken?

相关问题