如何在functions:shell中以经过身份验证的用户身份测试onCall函数

时间:2018-09-11 19:02:44

标签: firebase firebase-authentication google-cloud-functions

我想通过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?

1 个答案:

答案 0 :(得分:1)

根据文档,授权标头需要身份验证ID 令牌,而不是用户ID。您必须以某种方式生成令牌并将其传递给函数。然后,可调用函数将验证该令牌,并通过context.auth向该函数提供用户ID。

看起来您可以使用Firebase Auth REST API来获取这些令牌之一。或者,您可以在使用Firebase Auth客户端库的客户端应用程序中生成一个,将其记录并复制其值,然后使用它直至过期(1小时)。