簡體   English   中英

Supabase登錄同時獲取用戶session和profile

[英]Supabase login get user session and profile at the same time

有沒有辦法同時獲取用戶 session 和配置文件? 我這樣做的方式是在登錄后首先獲取用戶 session 然后使用 id 獲取用戶配置文件。

  const [authsession, setSession] = useState(null);
  const [loading, setLoading] = useState(false);
  const [error, setError] = useState(false);
  useEffect(() => {
    const userSession = supabase.auth.session();
    setSession(userSession);
    if (userSession) {
      getProfile(userSession.user.id);
    } else {
      setSession((s) => ({ ...s, profile: null }));
    }
    supabase.auth.onAuthStateChange((_event, session) => {
      setSession(session);

      if (session) {
        getProfile(session.user.id);
      } else {
        setSession((s) => ({ ...s, profile: null }));
      }
    });
  }, []);
  const getProfile = async (id) => {
    setLoading(true);
    setError(false);
    try {
      const { data } = await supabase
        .from("profiles")
        .select("*")
        .eq("id", id)
        .single();
      setSession((s) => ({ ...s, profile: data }));
    } catch (error) {
      setError(true);
    } finally {
      setLoading(false);
    }
  };

session.user object 包含一個名為user_metadata的屬性 - 此屬性包含存在於auth.users表的raw_user_meta_data列中的數據。

因此,您可以在自定義用戶配置文件表上設置一個數據庫觸發器,該觸發器將該表中的數據復制到 JSON 格式的auth.users表的raw_user_meta_data列,只要用戶配置文件表中的數據發生更改(即,您將需要觸發器在 INSERT/UPDATE 和可能的 DELETE 語句上運行)。 這樣,配置文件數據將通過登錄或令牌刷新事件自動傳遞給客戶端。

重要提示:這種方法有潛在的缺點:

  • 此數據也將作為 JWT 的一部分發送給用戶。 這可能是一個問題,因為 JWT 在其到期時間之前不容易撤銷,並且您最終可能會遇到 JWT 在 1 小時內到期(並將在 1 小時內刷新)仍然包含已被在服務器上更新。 這實際上取決於您在個人資料數據中輸入的內容以及您如何在客戶端和/或后端使用它;
  • 由於此數據位於 JWT 中,因此每次刷新 session(默認為每 1 小時)時,數據將重新發送到客戶端。 因此,(a)如果配置文件數據很大,您將在每次令牌刷新時發送這一大塊數據,即使它沒有更改,並且(b)如果數據經常更改並且您需要確保客戶端已啟動迄今為止(接近)實時,您需要提高令牌刷新率;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM