如何解决Firebase Cloud Storage签名的URL上传失败,并显示“匿名呼叫者没有storage.objects.create访问权限”
我正在尝试使用签名的URL将文件上传到Firebase Cloud Storage,如文档所述:https://cloud.google.com/storage/docs/access-control/signed-urls#signing-resumable
我正在使用node.js Admin SDK。
我得到一个看似有效的签名URL,但是在发送POST请求以获取会话URI时,出现以下错误:
<?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();
用于运行云功能的服务帐户具有“编辑者”,“服务帐户令牌创建者”和“存储对象创建者”权限(必须添加最后两个,以便我可以生成签名的URL。
我不认为这显然是缺乏权限的,因为错误消息指出请求是由匿名用户发出的,并非如此。
解决方法
使用签名的URL,令牌将在url查询中发送。因此,以下几行代码实际上是在剥离令牌的网址,因此它是匿名的。
const qsArr = signedUrl.split('?')
...
const response = await axios.post(
qsArr[0],{ params },options,)
将这些行更改为此行(或功能相同的行)可能会解决此问题
const qsArr = signedUrl
...
const response = await axios.post(
qsArr,)
至少这就是我的问题。您是否出于某种原因选择为已签名的网址剪切网址查询?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。