Firebase Cloud Functions:来自 referer <empty> 的请求被阻止。 - PERMISSION_DENIED

Firebase Cloud Functions: Requests from referer <empty> are blocked. - PERMISSION_DENIED

我不确定为什么以下代码抛出 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,
        }
    });
}

我使用 request-promise 进行请求的方式有问题吗?

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"
      }]
    }]
  }
}

因为您是从 node.js 环境中调用您的函数,所以未设置 HTTP Header Referer。当您通过浏览器创建请求时,浏览器会自动为您填写此字段。

您可以使用以下方式获得合适的推荐值:

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

此生成的 URL 不可调用,因为它不是以区域开头,但这意味着您现在有一个 URL 可用于识别呼叫即将到来来自云函数。

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

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。

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

就我而言,我有

    <meta name="referrer" content="no-referrer">

在头部,因此未发送引用者