发出 POST 请求时出现 Google Cloud Function CORS 错误
Posted
技术标签:
【中文标题】发出 POST 请求时出现 Google Cloud Function CORS 错误【英文标题】:Google Cloud Function CORS error when making POST request 【发布时间】:2021-06-18 22:17:16 【问题描述】:我无法在 GCF 中启用 CORS,allUsers 已启用。这是我在this post recommandations之后的代码
我使用 fetch 和 JSON 作为主体进行 POST 调用。 我的服务器应该通过执行 reCaptcha 验证来处理请求。 然后根据 reCaptcha 分数回复。
问题是我什至无法发出请求,我的服务器返回状态 500。 使用 'mode : no-cors' 发送电子邮件时会发送电子邮件。
exports.contactSendmail = (req, res) =>
res.set('Access-Control-Allow-Origin', '*');
if (req.method === 'OPTIONS')
/* handle preflight OPTIONS request */
res.set('Access-Control-Allow-Methods', 'GET, POST');
res.set('Access-Control-Allow-Headers', 'Content-Type, Accept');
// cache preflight response for 3600 sec
res.set('Access-Control-Max-Age', '3600');
return res.status(204);
const message, token, email = JSON.parse(req.body);
console.log(message, token, email);
// Load Node native HTTPS package
const https = require('https');
const sgMail = require('@sendgrid/mail');
sgMail.setApiKey(process.env.SENDGRID_API_KEY);
const recapatchaKeys =
secret: `myhiddensecretkey`,
response: token,
;
const urlPath = `/recaptcha/api/siteverify?secret=$recapatchaKeys.secret&response=$recapatchaKeys.response`;
const recaptchaOptions =
hostname: 'google.com',
// port: 443,
path: urlPath,
method: 'POST',
headers:
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': 0,
,
;
const reqRecaptcha = https.request(recaptchaOptions, (recaptchaResponse) =>
console.log(`reCaptcha statusCode: $recaptchaResponse.statusCode`);
recaptchaResponse.on('data', (d) =>
process.stdout.write(d);
const recapatchaRes = JSON.parse(d);
if (recapatchaRes.score > 0.7)
const msg =
to: process.env.CONTACT_EMAIL_RECIPIENT,
from: email,
subject: 'Nouveau contact',
text: message,
// html: "<strong>Its too simple to send mail</strong>"
;
//ES8
(async () =>
try
await sgMail.send(msg);
res.status(200).send('Email sent');
console.log('Email sent !');
catch (err)
console.error('Error with Sendgrid' + err.toString());
)();
else
res.status(403).send('Forbidden to send Email');
console.log('Forbidden to send Email');
);
);
reqRecaptcha.write('');
reqRecaptcha.end();
;
这是我的电话
const response = await fetch(process.env.CONTACT_SENDMAIL_URL,
method: 'POST',
headers:
Accept: 'application/json',
'Content-Type': 'application/json',
,
body: JSON.stringify(emailBody),
);
任何帮助将不胜感激
【问题讨论】:
您没有在其中处理任何身份验证,Docs 声明如果启用allUsers
,您应该在函数中处理身份验证以及 CORS(您正在执行的操作)以使其工作。或者,您可以尝试使用--allow-unauthenticated
部署它,这可能在您的项目中吗?
我已经使用“允许未经身份验证”(=> prnt.sc/10ubr02) 部署了我的函数。实际上,文档声明“然后在函数代码中处理 CORS 和身份验证”,但是我如何在代码中处理身份验证?
您可以按照here 的说明进行操作。
【参考方案1】:
如 cmets 中所述,您没有在其中处理任何身份验证。 Documentation 声明:
您可以使用
--allow-unauthenticated
标志部署它,或者使用控制台将 Cloud Functions Invoker 角色授予所有用户。然后在函数代码中处理CORS和鉴权。
为了处理最终用户的身份验证,您可以在代码中按照documentation 中的说明进行操作,该说明非常详细。
【讨论】:
@WytrzymałyWiktor 我需要一点帮助...我需要使用 Bearer 中的令牌从我的应用程序发送请求?我不明白 this code 正在做什么或应该实施什么以上是关于发出 POST 请求时出现 Google Cloud Function CORS 错误的主要内容,如果未能解决你的问题,请参考以下文章
发出 Ajax POST 请求时出现“parseerror”
发出 POST 请求时出现推送错误的 Laravel WebSocket