簡體   English   中英

您如何將身份驗證從 RTK 查詢傳遞到 firebase 函數以訪問實時數據庫?

[英]How do you pass authentication from an RTK Query to firebase functions to access realtime database?

在前端,一切都使用 firebase 登錄 api 進行正確驗證,並且 auth 更改的偵聽器獲取令牌和用戶信息以傳遞到后端。

這是 RTK 查詢中使用的一般字段:

  reducerPath: "api",
  baseQuery: fetchBaseQuery({
    baseUrl: "https://us-central1.cloudfunctions.net/api",
    mode: "cors",
    prepareHeaders: (headers) => {
      headers.set("Access-Control-Allow-Methods", "GET,PUT,POST,DELETE");
      headers.set("Access-Control-Allow-Origin", "*");
      headers.set("Access-Control-Allow-Headers", "Content-Type");
      const authToken = localStorage.getItem("AuthToken");
      if (authToken) headers.set("authorization", authToken);
      return headers;
    },
  }),
  endpoints: (builder) => ({
    getWorkouts: builder.query<GetWorkoutList, string>({
      query: (userId) => ({
        url: `/workouts/${userId}`,
      }),
    }),
---rest of endpoints---

這是檢查成功的前端身份驗證更改:


  useEffect(() => {
    const unsubscribe = onAuthStateChanged(auth, async (userInfo) => {
      setUser(userInfo);
      if (userInfo === null) {
        localStorage.clear();
      } else {
        const token = await userInfo.getIdToken(true);
        localStorage.setItem("AuthToken", `Bearer ${token}`);
      }
    });
    return unsubscribe;
  }, [user]);

在 firebase 功能中,它使用管理員級別從前端驗證令牌,而后端的 rest 使用普通用戶權限。

const decodedIdToken = await adminApp.auth().verifyIdToken(idToken);

問題是使用管理員級別繞過了安全規則,實際上並沒有為用戶訪問數據庫提供身份驗證。

向實時數據庫請求身份驗證 object 以成功通過 firebase 規則的實際步驟是什么?

    "users":{
      "$userId":{
        ".write": "$userId == auth.uid",
        ".read": "$userId == auth.uid",
      },
    },

(身份驗證 == 空)

來自管理員 SDK 的請求通常是完全可信的並且繞過安全規則。

對於實時數據庫,雖然您可以在初始化 Admin SDK 時傳遞databaseAuthVariableOverride ,並傳遞您自己的 UID,如有關使用有限權限進行身份驗證的文檔中所示。 雖然我自己從未對此進行過測試,但我認為您也可以傳遞其他聲明 - 因為您傳遞的信息只是成為規則中的auth變量。

暫無
暫無

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

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