[英]connect firebase authentication with realtime database from 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.