Menyimpan Firebase accessToken dalam kedai Pinia - Vue3
P粉966335669
P粉966335669 2023-12-31 18:42:37
0
1
549

Saya agak baru menggunakan Vue dan ini kali pertama saya menggunakan Pinia. Saya mengikuti panduan ini untuk menyediakan Firebase, Pinia dan Axios. Apl yang saya bina menggunakan FirebaseUI untuk membenarkan pengguna log masuk melalui pautan e-mel - semuanya berlaku dalam komponen Halaman Masuk di bawah:

(Sila abaikan mana-mana pembolehubah/fungsi daripada jenis yang salah - Saya hanya mahu ia berfungsi di tempat pertama)

<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>

Apabila pengguna berjaya log masuk, aplikasi mengemas kini objek pengguna kedai Pinia menggunakan objek kembali AuthResult fungsi signInSuccessWithAuthResult. Apabila penyahpepijat saya dapat melihat objek yang disimpan kelihatan seperti ini:

{
    additionalUserInfo: {...}
    operationType: "signIn"
    user: {
        accessToken: "eyJhbGciOiJSUzI1N..."
        auth: {...}
        displayName: null
        ...
    }
}

Menyimpan accessToken. Storan pengguna adalah seperti berikut:

import { defineStore } from 'pinia'

export const useUserStore = defineStore("userStore", {
  state: () => ({
    user: null as any
  }),
  getters: {
    getUser(state) {
      return state.user
    }
  }
})

Dalam aplikasi, saya menyediakan pemintas axios yang melampirkan accessToken kepada mana-mana permintaan Axios yang dibuat oleh aplikasi:

axiosInstance.interceptors.request.use((config) => {
  const userStore = useUserStore();
  
  if (userStore) {
    debugger;
    // accessToken is undefined
    config.headers.Authorization = 'Bearer ' + userStore.user.user.accessToken;
  }
  return config;
});

Apabila cuba mendapatkan semula accessToken dari storan pengguna pada ketika ini, ia hilang. Kebanyakan, jika tidak semua, sifat lain dalam objek pengguna masih ada, tetapi token akses tidak ada, jadi saya agak pasti saya menggunakan storan dengan betul:

{
    additionalUserInfo: {...}
    credential: null
    operationType: "signIn"
    user: {
        // accessToken is gone
        apiKey: "..."
        appName: "[DEFAULT]"
        email: "..."
        emailVerified: true
        ....
    }
}

Boleh sesiapa jelaskan saya di mana silap saya dan mengapa accessToken dialih keluar dari kedai? Nampaknya saya menggunakan kedai Pinia dengan betul, dan saya agak pasti pemintas itu betul juga. Walau bagaimanapun, saya mungkin menyimpan token akses dengan cara yang salah. Saya amat berterima kasih jika anda boleh memberikan bantuan/nasihat tentang cara menyediakan Pengesahan Firebase dengan Vue dengan betul.

Diedit untuk memasukkan nilai yang disimpan pengguna semasa menyahpepijat di dalam pemintas.

P粉966335669
P粉966335669

membalas semua(1)
P粉170438285

Nampaknya accessToken mungkin berada dalam userStore.user.user.accessToken?

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan