当前位置: 首页 > 知识库问答 >
问题:

Firebase Cloud Storage签名url上传失败,“匿名调用者没有storage.objects.create访问权限”

祖波光
2023-03-14

我正在尝试使用签名URL将文件上传到Firebase Cloud Storage,如文档中所述:https://cloud.google.com/storage/docs/access-control/signed-urls#signing-resumable

我正在使用节点。js Admin SDK。

我得到了一个看起来有效的签名URL,但在发送获取会话URI的POST请求时,我得到了以下错误:

<?xml version='1.0' encoding='UTF-8'?><Error><Code>AccessDenied</Code><Message>Access denied.</Message><Details>Anonymous caller does not have storage.objects.create access to projname.appspot.com/filename.ext.</Details></Error>

下面是我用来发出请求的代码:

const admin = require('firebase-admin');
const axios = require('axios').default;
const queryString = require('query-string');
const serverKey = require(<server key path>)

admin.initializeApp({
    credential: admin.credential.cert(serverKey),
    storageBucket: "projname.appspot.com",
});


async function run() {
    const bucket = admin.storage().bucket()
    const file = bucket.file(`filename.ext`)
    var expires = new Date()
    expires.setTime(expires.getTime() + (12 * 60 * 60 * 1000))
    const signedUrlArr = await file.getSignedUrl({
        action: 'resumable',
        expires: expires,
    })
    const signedUrl = signedUrlArr[0]
    const qsArr = signedUrl.split('?')
    const params = queryString.parse(qsArr[1]);

    try {
        const options = {
            headers: { "x-goog-resumable": "start" }
        };
        const response = await axios.post(
            qsArr[0],
            { params },
            options,
        )
        console.log(response)

    } catch (e) {
        console.error(e.response.data)
    }
}


run();

我不认为这是缺乏权限,因为错误消息说请求是由匿名用户发出的,事实并非如此。

共有1个答案

柯伟志
2023-03-14

使用签名的URL,将在URL查询中发送令牌。下面几行代码实质上是剥离令牌的url,因此它是匿名的。

    const qsArr = signedUrl.split('?')
...
        const response = await axios.post(
            qsArr[0],
            { params },
            options,
        )

将这些行更改为this(或功能相同的内容)可能会解决问题

    const qsArr = signedUrl
...
        const response = await axios.post(
            qsArr,
            { params },
            options,
        )

至少在我看来是这样的问题。您选择删除签名url的url查询有什么原因吗?

 类似资料:
  • 我正在尝试访问Sentinel2公共数据,如下所述:https://cloud.google.com/storage/docs/public-datasets 该文件说:“相比之下,使用云存储API链接访问公共数据不需要身份验证。” 然而,我收到了以下错误:“com.google.cloud.storage.存储异常:匿名调用者storage.objects.get访问谷歌云存储对象。”我正在使用

  • 我正在使用Auth0并尝试通过调用Microsoft标识平台来验证Signature,但我在调用验证方法时收到了下面的错误。还请找到我的代码片段。 代码段: 错误 通用域名格式。auth0.jwt。例外情况。SignatureVerificationException:在com上使用算法SHA256withRSA验证时,令牌的签名无效。auth0.jwt。算法。RSA算法。在com上验证(rsaa

  • 问题内容: 我正在使用Java8和aws-java-sdk1.10.43来获取S3文件的预签名URL。我确实获得了一个链接,但是浏览到该链接会导致此错误: 您提供的授权机制不受支持。请使用AWS4-HMAC-SHA256 要强调的是,我希望生成一个可以通过电子邮件发送并在浏览器中打开的URL,而不是使用Java代码从该URL中读取。 我正在使用下面的代码,并且我相信发现我需要以某种方式将setSS

  • 我正在使用另一个twitter oAuth cURL访问令牌请求的代码/指南,该请求无法测试对API的签名。我还在试着完成第一步 注意:钥匙只是随机的,它们不是真的:) 当我尝试在没有oauth\u回调的情况下发出请求时,我从api得到了一个有效的响应 https://api.twitter.com/oauth/request_token?oauth_consumer_key=nHb2kSQ2CD

  • 我有一个默认ACL设置为private的bucket。我想生成预签名的url,并将其分发给用户,以便他们可以上传文件,上传后文件需要公开访问。 我可以生成预签名的url并上传文件,但文件始终保持私有。如果我在创建签名url时将ACL设置为“public-read”,那么getSignedUrl()正在生成签名url,但对该签名url的PUT请求会拒绝访问。 bucket可以包含私有或公共可访问的文

  • 我试图使用S3预签名的PUT url执行文档上传。我使用java AWSSDK(GeneratePresignedUrlRequest.java)生成url。此url生成代码位于AWS API网关后面的lambda函数中。 然而,当我在Postman中复制生成的url时,我遇到了以下错误 生成的url是“https:// 关于在生成url时需要更正的内容,有什么建议吗?