每当我尝试POST请求函数时https://europe-west3-[我的项目].cloudfunctions.net/[我的函数名]我收到了401的回复,正文:
{
"error": {
"message": "Unauthenticated",
"status": "UNAUTHENTICATED"
}
}
该方法本身包括验证:
export const myFunctionName = regionFunctions.https.onCall(
async (request, context) => {
if (!userIsAuthenticated(context)) return {status: 401}
if (!userIsAdmin(context)) return {status: 403}
await syncCategories()
return {status: 200}
})
export const userIsAuthenticated = (context: CallableContext) => {
return context.auth
}
我试图做的是在请求授权标头中使用firebase项目设置中的服务器密钥。
我是否使用了错误的服务器密钥,或者可能是什么问题?
非常感谢。
对于可调用函数,通常根本不应该处理头。客户端SDK将自动为您处理所有这些,如文档中所示。
但是,如果确实需要使用HTTPS直接调用可调用函数,则Authorization标头需要是协议文档中描述的Firebase Authentication用户ID令牌。它不是服务器密钥。
谢谢Doug,
你的回答帮助我解决了这个问题。
我所做的:登录到我的应用程序,通过浏览器控制台查看用户ID令牌,将其复制到Authorization头中,它就工作了。
是的,可以使用来自谷歌云的API密钥。您必须使用这个概念:请求格式:标头对可调用触发器端点的HTTP请求必须是具有以下标头的POST:可选:X-Firebase-AppCheck:由发出请求的客户端应用程序提供的Firebase应用程序检查令牌。后端会自动验证此令牌并对其进行解码,从而在处理程序的上下文中注入appId。如果无法验证令牌,则拒绝请求。(适用于SDK>=3.14.0(如果包含任何其他标头,请求将被拒绝,如下面的响应文档中所述。