[英]403 The caller does not have permission for Firebase Management API addFirebase
我想通过 Firebase Management Api 添加 Firebase 项目。 所以为此。 我在谷歌云平台控制台上做了项目。 并以所有者身份创建了服务帐户。
我尝试阅读并创建项目 throw google api explorer for addFirebase并且它有效。 但是当我尝试通过我的代码做同样的事情时,它成功读取了availableProject并将输出作为
{ "projectInfo": [ { "project": "projects/firebase-api-238012", "displayName": "Firebase-Api" } ] }
但是当我尝试添加项目时它给了我这个错误
{ "error": { "code": 403, "message": "调用者没有权限", "status": "PERMISSION_DENIED" } }
我不知道为什么它没有创建项目。 它需要什么其他许可。 以及为什么它允许我先阅读可用的项目。
这是我尝试添加项目的方式。
jwt.js
const { google } = require('googleapis');
var serviceAccountJwt = require('./Firebase-Api-b0e41b85ad44.json');
exports.connect = async () => {
return new Promise((resolve, reject) => {
// scope is based on what is needed in our api
const scope = ['https://www.googleapis.com/auth/firebase', 'https://www.googleapis.com/auth/cloud-platform'];
// create our client with the service account JWT
const { client_email, private_key } = serviceAccountJwt;
const client = new google.auth.JWT(client_email, null, private_key, scope, null);
// perform authorization and resolve with the client
return client.authorize((err) => {
if (err) { reject(err) }
else {
resolve(client)
};
});
});
}
index.js 文件
const { google } = require('googleapis');
const request = require('request');
const { connect } = require('./jwt');
const availableProjects = 'https://firebase.googleapis.com/v1beta1/availableProjects';
async function getAccessToken() {
let client = await connect();
let accessToken = await client.getAccessToken();
let res = await getProjects(accessToken.token)
}
getAccessToken().catch(err => {
console.log(JSON.stringify(err))
})
const bodys = {
"timeZone": "America/Los_Angeles",
"locationId": "asia-south1",
"regionCode": "US"
}
async function getProjects(accesstoken) {
let options = {
url: availableProjects,
headers: {
'Authorization': 'Bearer ' + accesstoken,
'Accept': 'application/json',
'Content-Type': 'application/json'
}
}
return request(options, async function (err, res) {
if (err) {
console.error(err + " error");
} else {
//here it gives successful output
console.log("response")
console.log(res.body);
let bodyJson = JSON.parse(res.body);
let projectName = bodyJson.projectInfo[0].project;
console.log(projectName)
await addProject(accesstoken, projectName)
return res.body;
}
});
}
async function addProject(accesstoken, projecctID) {
fbUrl = getAddFBUrl(projecctID);
let options = {
url: fbUrl,
headers: {
'Authorization': 'Bearer ' + accesstoken,
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body:JSON.stringify(bodys)
}
return request.post(options, function (err, res) {
if (err) {
console.error(err + " error");
} else {
//here in response out put as permission denied 403
console.log("response")
console.log(res.body);
console.log(JSON.stringify(res));
return res.body;
}
});
}
function getAddFBUrl(projectId) {
return 'https://firebase.googleapis.com/v1beta1/' + projectId +
':addFirebase';
}
我发现了一个与此类似的问题。 但这并没有帮助我解决这里的问题
来自 Firebase REST 参考:方法:projects.addFirebase
要调用 projects.addFirebase,成员必须是现有 GCP 项目的编辑者或所有者。
服务帐号无法调用 projects.addFirebase。
更新:
要调用 projects.addFirebase,项目成员或服务帐户必须具有以下权限(Editor 和 Owner 的 IAM 角色包含这些权限):firebase.projects.update、resourcemanager.projects.get、serviceusage.services.enable 和 serviceusage .services.get。
https://firebase.google.com/docs/projects/api/reference/rest/v1beta1/projects/addFirebase
我不确定我的回答是否对这个问题的作者有帮助,但是如果前两件事都应该在面对 Google Cloud API 的 403 错误时检查
0) 使用 gcloud 检查配置
1) 如前所述,首先要检查服务帐户的角色。 您通常需要编辑/所有者。
https://cloud.google.com/iam/docs/understanding-roles
https://console.cloud.google.com/iam-admin
2) 第二个是检查是否为项目启用了 API。
此外,在创建密钥时,请检查它是否有正确的服务帐户。
对于像我这样刚入门的人来说,这件事可能会有所帮助。 当我设置数据库时,我选择Start in locked mode而不是Start in test mode 。 因此,我不会读或写:((。对于初学者,只需将所有内容设置为测试模式即可。希望对您有所帮助。
您的问题意味着您的项目未与您的 firebase 帐户关联,这意味着您必须使用您的 firebase 帐户登录。 比你将获得许可
cd functions
firebase login
它会起作用
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.