我正在开发一个 React 应用程序,需要调用由 Firebase 身份验证保护的 python Google Cloud Function get2。但是,当我尝试调用云函数时,收到一条错误消息:“请求未经身份验证。要么允许未经身份验证的调用,要么设置正确的授权标头。” 如果我允许未经身份验证的调用,则一切正常,但我希望仅允许经过身份验证的用户能够调用云功能。 云函数将角色
Cloud Functions Invoker
分配给 allAuthenticatedUsers
,并且在云运行(因为它是第 2 代)的安全选项卡中我选择了 Require authentication
。
这是我的反应组件的片段:
const callCloudFunction = async () => {
try {
if (!auth.currentUser) {
throw new Error("User not authenticated");
}
const helloWorld = httpsCallable(functions, 'hello_world');
const response = await helloWorld();
console.log(response.data);
setResult(response.data);
} catch (error) {
console.error("Error calling Cloud Function:", error);
setError(error.message || error.toString());
}
};
我还尝试添加令牌ID,如下所示:
// Get the ID token
const token = await auth.currentUser.getIdToken();
const helloWorld = httpsCallable(functions, 'hello_world', {
// Include the Authorization header with the bearer token
headers: {
Authorization: `Bearer ${token}`
}
});
但没有成功。预先感谢您。
编辑: 以下是有关云功能/云运行和 firebase 配置的一些附加信息:
云运行安全身份验证:(云运行 -> 单击服务 -> 安全选项卡)
由此,如果我将云运行安全身份验证更改为“允许未经身份验证的调用”,一切都会正常,但这可能是因为没有身份验证并且云功能是公共的。但是,另一方面,如果我将其保留为“需要身份验证”,我会在云运行日志中看到以下内容:
在Firebase中,启用的身份验证方法是电子邮件/密码,并且当前创建了1个用户。我可以使用 firebase 身份验证登录,但无法对云功能进行经过身份验证的调用。
Cloud Run 服务默认是私有部署的,这意味着如果不在请求中提供身份验证凭据,则无法访问它们。这些服务由 IAM 保护。默认情况下,服务只能由项目所有者、项目编辑者以及 Cloud Run 管理员和 Cloud Run 调用者调用。您可以在 Cloud Run 服务上配置 IAM 以向其他用户授予访问权限。
身份验证的常见用例包括:
允许公共(未经身份验证)访问:允许未经身份验证的服务调用,使服务可公开访问。