403呼叫者无权使用Firebase Management API addFirebase

时间:2019-04-19 07:10:54

标签: firebase google-api google-cloud-platform firebase-authentication google-oauth

我想通过Firebase Management Api添加Firebase项目。因此。我在Google Cloud Platform控制台上制作了项目。并创建拥有所有者权限的服务帐户。

我尝试为addFirebase阅读并创建项目抛出google api资源管理器,并且可以正常工作。但是,当我尝试通过我的代码执行相同操作时,它成功读取了availableProject并将输出显示为

  

{     “ projectInfo”:[       {         “ project”:“ projects / firebase-api-238012”,         “ displayName”:“ Firebase-Api”       }     ]   }

但是当我尝试添加项目时,它会给我这个错误

  

{     “错误”:{       “代码”:403,       “ message”:“呼叫者没有权限”,       “状态”:“ 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';
}
我发现了一个与此类似的问题。但这并没有帮助我解决here

的问题

AskFirebase

4 个答案:

答案 0 :(得分:1)

您的问题意味着您的项目未与Firebase帐户关联,这意味着您必须使用Firebase帐户登录。比您将获得许可

    在您的Firebase项目目录中
  1. 键入cd functions
  2. 键入firebase login
  3. 使用与您的Firebase帐户关联的Gmail登录

可以使用

答案 1 :(得分:0)

从Firebase REST参考中:方法:projects.addFirebase

  

要调用projects.addFirebase,成员必须是的编辑者或所有者   现有的GCP项目。 服务帐户无法致电   projects.addFirebase。

https://firebase.google.com/docs/projects/api/reference/rest/v1beta1/projects/addFirebase

答案 2 :(得分:0)

我不确定我的答案是否会对这个问题的作者有所帮助,但是如果面对Google Cloud API的403错误,前两件事都应该检查的话

0)使用gcloud检查配置

1)如前所述,第一件事是检查服务帐户的角色。您通常需要编辑者/所有者。

https://cloud.google.com/iam/docs/understanding-roles

https://console.cloud.google.com/iam-admin

enter image description here

enter image description here

2)第二个是检查是否完全为项目启用了API。

enter image description here enter image description here

此外,在创建密钥时,请检查其是否正确的服务帐户。

答案 3 :(得分:0)

对于像我这样刚入门的人来说,这件事可能会有所帮助。当我设置数据库时,我选择以锁定模式启动而不是以测试模式启动。因此,我无法读取或写入 :((。对于初学者,只需将所有内容设置为测试模式。希望对您有所帮助。

https://i.stack.imgur.com/nVxjk.png