我想通过firebase functions:shell
作为经过身份验证的usr测试onCall函数
我尝试了来自https://firebase.google.com/docs/functions/local-emulator#invoke_https_functions的多种通话组合
以及下载和设置GOOGLE_APPLICATION_CREDENTIALS
env var
我的功能如下:
exports.sendMessage = functions.https.onCall((data, context) => {
if (!context.auth) {
throw new functions.https.HttpsError('failed-precondition', 'The function must be called while authenticated.');
}
// Other logic
}
一旦在我的ios应用程序中部署并成功运行,它就可以正常工作,但是我无法在外壳中运行它。
以下命令实际上会执行该功能:
sendMessage.post({headers: {'content-type' : 'application/json'},body: JSON.stringify({data: {'messageId':'test'} }) })
并返回
RESPONSE RECEIVED FROM FUNCTION: 400, {“error”:{“status”:“FAILED_PRECONDITION”,“message”:“The function must be called while authenticated.“}}
哪个是正确的,但是我现在想要一个经过身份验证的用户。当我尝试添加docs建议的auth时:
sendMessage('data', {auth:{uid:'USERUID'}}).post({headers: {'content-type' : 'application/json'},body: JSON.stringify({data: {'messageId':'test'} }) })
我最终得到ERROR SENDING REQUEST: Error: no auth mechanism defined
如果我尝试遵循此页面https://firebase.google.com/docs/functions/callable-reference上的Authorization标头,如下所示:
sendMessage.post({headers: {'Authorization': 'Bearer USERUID', 'content-type' : 'application/json'},body: JSON.stringify({data: {'messageId':'test'} }) })
我回来了:
从功能接收到的响应:401,{“错误”:{“状态”:“未经授权”,“消息”:“未经验证”}}
您如何以经过身份验证的用户身份发送请求?
相关链接 How to test `functions.https.onCall` firebase cloud functions locally?
答案 0 :(得分:1)
根据文档,授权标头需要身份验证ID 令牌,而不是用户ID。您必须以某种方式生成令牌并将其传递给函数。然后,可调用函数将验证该令牌,并通过context.auth
向该函数提供用户ID。
看起来您可以使用Firebase Auth REST API来获取这些令牌之一。或者,您可以在使用Firebase Auth客户端库的客户端应用程序中生成一个,将其记录并复制其值,然后使用它直至过期(1小时)。