【问题标题】:Firebase Cloud Functions: Requests from referer <empty> are blocked. - PERMISSION_DENIEDFirebase Cloud Functions:来自referer <empty> 的请求被阻止。 - 没有权限
【发布时间】:2019-12-29 14:31:41
【问题描述】:

我不确定为什么以下代码会抛出 google api key 权限被拒绝。 我在 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 firebase firebase-dynamic-links request-promise


    【解决方案1】:

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

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

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

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

    要使用它,请将其添加到您的 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。

    【讨论】:

    • 引用者必须是谷歌控制台中接受的域。
    • 添加 headers/referer 字段后,我仍然遇到同样的错误。我也将网址列入白名单。还是不行。同样的错误
    • @coolcool1994 您可以尝试重新生成 API 密钥或从头开始创建新的 API 密钥 - 但立即使用新密钥将 URL 列入白名单吗?我在为另一个客户工作时遇到了同样的问题。我无权访问该帐户进行测试,但想知道这是否可以解决此问题。我们暂时解决了下面使用 Zack Phan 的想法将限制设置为无。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      在我的情况下,我有

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

      在头部,所以没有发送引用者

      【讨论】:

      • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
      猜你喜欢
      • 2022-01-13
      • 1970-01-01
      • 2019-07-10
      • 2020-07-05
      • 2018-10-02
      • 2021-04-05
      • 2021-04-07
      • 2019-01-14
      • 2017-09-04
      相关资源
      最近更新 更多