您正在使用 Firebase HTTPS Callable Functions,它具有 Firebase 身份验证 的功能来对您的应用的用户进行身份验证。
但您希望将 Cloud Function 设为私有以确保安全且不被公开访问。
=======编辑=======
为了避免 CORS,我尝试在 firebase.jon 中添加 Cloud 功能作为 Firebase Hosting 重写:
注意:Firebase Hosting 仅支持 us-central1 中的 Cloud Functions,因此此选项不适合您。但是,我在 us-central1 中使用 Firebase Hosting 进行了以下测试
"rewrites": [
{
"source":"/test",
"function":"test"
}
]
另外,我更改了云函数代码以验证ID tokens
云功能
const cors = require('cors')({origin: true});
const functions = require('firebase-functions');
var admin = require("firebase-admin");
var serviceAccount = require(".ServiceAccount.json");
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: "DATABASE_URL"
});
exports.test = functions.https.onRequest((req, res) => {
cors(req, res, () => {
const tokenId = req.get('Authorization').split('Bearer ')[1];
return admin.auth().verifyIdToken(tokenId)
.then((decoded) => res.status(200).send(decoded))
.catch(function(err) {
console.error(err);
console.log(err);
res.status(401).send(err)});
});
});
客户端:
firebase.auth().currentUser.getIdToken(true)
.then(function(idToken){
console.log('Id token is..');
console.log(idToken);
fetch('Cloud_Function_endpoint',{
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + idToken
},
method: 'post',
body: JSON.stringify({ data })
}).then(result => {
console.log(result);
}).catch(error => {
console.log(error);
});
}).catch(function(error){
console.log(error);
});
因此,在进行这些更改后,我不再遇到 CORS 问题,而是收到 401 (Unauthorized) 错误。
经过测试的解决方案:
结论:
- 无法从 Firebase 应用访问私有云函数。
- 唯一的解决方案是拥有一个公共云功能。