Firebase云功能:来自引用人<empty>的请求被阻止。 - 没有权限

时间:2019-12-29 14:31:41

标签: node.js firebase firebase-dynamic-links request-promise

我不确定为什么以下代码会引发Google api密钥权限被拒绝。 我在Firebase控制台和Google控制台中都启用了api或服务。

export async function createJobDynamicLink(job){
    if(job.jobStatus !== 'approved' ||  (job.dynamicLink).length > 2){
        console.log('Dynamic link already exist!');
        return false;
    }

    console.log(dynamic_links);
    console.log(dynamic_links_key);
    // Firebase web api key logs just fine
    const options = {
        method: 'POST',
        uri: `https://firebasedynamiclinks.googleapis.com/v1/shortLinks?key=${dynamic_links_key}`,
        body: {
            "longDynamicLink": makeDynamicLongLink(job)
        },
        json: true
    };

    return await requestpromise(options)
        .then(function (parsedBody) {
            console.log(parsedBody);
            return parsedBody.shortLink;
        })
        .then((shortLink) => {
            //post.shareUrl = shortLink;
            console.log('short link: ' + shortLink);
            //return event.data.ref.set(post);
            return shortLink;
        })
}
export async function makeDynamicLongLink(job) {
    return buildUrl(`${dynamic_links}`, {
        queryParams: {
            link: `https://app.com/jobs/${slugify(job.jobTitle)}-${job.id}`,
            apn: "com.app.appe",
            ibi: "com.app.app",
            dfl: "https://app.com",
            st: job.jobTitle,
        }
    });
}

我使用请求承诺处理请求的方式有问题吗?

StatusCodeError: 403 - {
  "error": {
    "code": 403,
    "message": "Requests from referer <empty> are blocked.",
    "status": "PERMISSION_DENIED",
    "details": [{
      "@type": "type.googleapis.com/google.rpc.Help",
      "links": [{
        "description":"Google developer console API key",
        "url": "https://console.developers.google.com/project/904573jjwj/apiui/credential"
      }]
    }]
  }
}

2 个答案:

答案 0 :(得分:1)

由于要从node.js环境中调用函数,因此未设置HTTP标头Referer。通过浏览器创建请求时,浏览器将自动为您填充此字段。

您可以使用以下方法获得合适的引荐来源网址值:

"https://" + process.env.GCLOUD_PROJECT + ".cloudfunctions.net/createJobDynamicLink"
// becomes "https://your-project-id.cloudfunctions.net/createJobDynamicLink"

此生成的URL不可调用,因为它不是以区域开头的,但这意味着您现在有了一个URL,可用于识别该呼叫来自Cloud Function。

要使用它,请将其添加到您的request-promise选项对象中。

const options = {
        method: 'POST',
        uri: `https://firebasedynamiclinks.googleapis.com/v1/shortLinks?key=${dynamic_links_key}`,
        body: {
            "longDynamicLink": makeDynamicLongLink(job)
        },
        headers: {
            "Referer": "https://" + process.env.GCLOUD_PROJECT + ".cloudfunctions.net/createJobDynamicLink"
        },
        json: true
    };

注意:我将使用request-promise-native而不是request-promise-相同的API,但是会跳过加载Bluebird。

答案 1 :(得分:1)

转到Google API凭据https://console.developers.google.com/apis/credentials,查看您所使用的API密钥是否受到任何限制。 如果受 HTTP引荐来源网址限制,则将您的网站域添加到其中,并添加 Referrer 标头,就像上面的答案一样。 尽管在您的用例中, IP地址限制是一个更好的选择。