从 firebase 云函数调用的 getSignedURL() 给出权限被拒绝错误(firebase-functions v2)

问题描述 投票:0回答:1

我只需要为经过身份验证的用户下载 html 页面,页面以 html 形式存储在“Firebase Storage”中。

我通过使用 getDownloadURL() (注释掉)的下面的 firebase 云函数 (v2) (getReportForUser) 获得了正确的操作,问题是用户可以共享文件,这是我想避免的,所以我改用 getSignedURL () 这将为用户提供有限的时间来下载文件,但我收到错误:

Permission 'iam.serviceAccounts.signBlob' denied on resource (or it may not exist).

这是验证下载文件的正确方法吗?是的,我们该如何解决此错误?

exports.getReportForUser = onCall({ region: ["europe-west1"] }, async (request) => {

    const getReportURLsync = () => {
        return new Promise(async (resolve) => {
            // Get a reference to index.html file in storage bucket
            const fileRef = getStorage().bucket("wa-connect").file("reports/" + "index.html");
            resolve(await fileRef.getSignedUrl({version: "v4", action: "read", expires: Date.now() + 1000 * 60 * 2, })); // expires in 2 minutes
            //resolve( await getDownloadURL(fileRef));

        }
    )}
    
    async function getReportURL(serial, timestamp) {
        return await getReportURLsync(serial, timestamp);
    }

    try {
        return { reportURL: await getReportURL() };
    } catch (err) {
        info("Error caught in getReportForUser code: ", "->", err);
    }
});

我还尝试了Cloud Function 中的 getSignedUrl Promise 的权限被拒绝中接受的答案,但它不起作用!

javascript firebase firebase-authentication google-cloud-functions google-cloud-storage
1个回答
0
投票

下载 URL 和签名 URL 都允许公开访问该文件,这不是您想要的。

相反,您需要使用 SDK 通过其 getBlob

getBytes
getStream
 方法来下载数据。这些方法都允许授权用户访问文件中的数据,而无需使用公共 URL。

© www.soinside.com 2019 - 2024. All rights reserved.