node.js - Firebase Cloud Functions:来自referer 的请求被阻止。- 没有权限
问题描述
我不确定为什么以下代码会抛出 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
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。
推荐阅读
- https - “443 端口似乎已关闭”Elastic Beanstalk 负载均衡器
- java - 如何访问没有应用程序 ID 的默认应用程序?
- mysql - 确定用户的新分数是否是他们在特定活动中获得的最佳分数
- c++ - 如何为调用 DirectX 函数的 C# 窗体制作 C++ Dll?
- css - 用于在一个 div 中对齐图标和文本的 flexbox 属性
- node.js - 如何将 isValidUser() 与 passportjs 一起使用
- windows - Windows 10 中 Chrome/Edge 浏览器的单一实例
- javascript - 所选值为空,甚至在开发人员工具中标记为选中
- ruby-on-rails - Rails 禁用 SQL 生成的别名
- go - Antlr4 clearDFA golang