Javascript Firestore向请求添加身份验证

Javascript Firestore向请求添加身份验证,javascript,express,google-cloud-firestore,firebase-authentication,firebase-security,Javascript,Express,Google Cloud Firestore,Firebase Authentication,Firebase Security,我正在尝试找出如何验证我对firestore的请求 我正在使用https://identitytoolkit.googleapis.com/v1/accounts:signInWithPassword?key=这两种方法都会返回用户的idToken 我在我的路由上进行身份验证,但仍然会暴露我的firestore,因此我转而使用安全规则,但似乎无法对任何请求进行身份验证 我正在使用express处理本地使用此格式到firestore的路线: GEThttp://localhost:5001//us

我正在尝试找出如何验证我对firestore的请求

我正在使用
https://identitytoolkit.googleapis.com/v1/accounts:signInWithPassword?key=
这两种方法都会返回用户的idToken

我在我的路由上进行身份验证,但仍然会暴露我的firestore,因此我转而使用安全规则,但似乎无法对任何请求进行身份验证

我正在使用express处理本地使用此格式到firestore的路线:

GEThttp://localhost:5001//us-central1/数据库/用户/
规则:允许读取,写入:如果为true;
得到https://firestore.googleapis.com/v1/projects//databases/(默认)/文档/用户
内容类型:application/json
答复:200(我看到了所有文件)
规则:允许读,写:if request.auth!=无效的
得到https://firestore.googleapis.com/v1/projects//databases/(默认)/文档/用户
授权:承载{{idToken}
内容类型:application/json
答复:{
“错误”:{
“代码”:403,
“消息”:“缺少或权限不足。”,
“状态”:“权限被拒绝”
}
}
更多详细信息

下面的代码可以工作,但使用firebase的其他方式获取数据时,它绕过了这一点,只会根据安全规则进行限制

索引

import*作为“firebase函数”中的函数;
从“快递”以快递方式导入*;
从“cors”导入*作为cors;
导入已从“./components/middleware/authenticated”进行身份验证;
导入是从“./components/middleware/authorized”授权的;
从“./users/controllers/all”导入用户\u all;
const route=express();
使用(cors({origin:true}));
get('/users',isAuthenticated,isAuthenticated({hasRole:['admin',manager']}),users\u all);
exports.database=functions.https.onRequest(路由);
所有用户

从“express”导入{Request,Response};
从“../../components/reporting/sentry”导入sentry;
从“../../components/firebase/Fireapp”导入Fireapp;
Fireapp
const all=async(请求:请求,响应:响应)=>{
试一试{
let profiles:any=[];
/**检索准确的文档引用*/
const reference=Fireapp.firestore().collection('users').get()
.then((文档:firebase.firestore.QuerySnapshot)=>{
documents.docs.forEach((doc:firebase.firestore.DocumentData)=>{profiles.push(doc.data())});
返回配置文件;
});
返回承诺。全部([参考])。然后((回复:任意)=>{
资源状态(200)。发送(配置文件);
}).catch((错误:any)=>{throw error});
}捕获(错误){
sentry(错误,{service:'[GET ALL USER]',级别:'mediate',消息:error.message});
资源状态(400).发送(错误消息)
}
}
导出默认值全部;

我使用Firebase auth而不是IdentityToolKit,但是。。。您的规则不应该读:规则:允许读,写:if request.auth.uid!=无效的您的规则缺少request中的“.uid”。request.auth是它接收到的对象,uid是一个属性,但它不应该工作。我刚才使用curl,使用您列出的相同“request.auth!=null”规则,在我的一个Firebase项目上模拟您的identityToolKit和firestore api调用……它工作了。我能够从一个集合中检索文档。我认为你所做的应该是有效的,你走在正确的轨道上。。。也许这只是一个更详细的语法问题让你绊倒了?我也有一个类似的错误。原来这是因为我试图访问子集合,但默认情况下规则不是递归的。向规则中添加递归通配符可以使其正常工作。请参阅我的答案