当前位置: 首页 > 知识库问答 >
问题:

Google Cloud函数CORS错误时发出POST请求

柯镜
2023-03-14

我不能在GCF中启用CORS,ALLUSES已启用。下面是我在这个post命令之后的代码

我使用fetch和JSON作为主体进行POST调用。我的服务器应该通过执行reCaptcha验证来处理请求。然后根据reCaptcha得分进行响应。

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();
};

这是我的电话

js prettyprint-override">const response = await fetch(process.env.CONTACT_SENDMAIL_URL, {
  method: 'POST',
  headers: {
    Accept: 'application/json',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify(emailBody),
});

如有任何帮助,我将不胜感激

共有1个答案

彭展
2023-03-14

正如注释中提到的,您没有在其中处理任何身份验证。文件指出:

您可以使用--allow-unauthenticated标志部署它,或者使用控制台向所有用户授予云函数调用器角色。然后在函数代码中处理CORS和身份验证。

为了处理最终用户的身份验证,您可以在代码中遵循另一篇文档中的说明,这篇文档非常详细。

 类似资料:
  • 我是新来的vuejs和我下面的教程(https://www.youtube.com/watch?v=Wy9q22isx3U

  • Angular.js:14516可能未处理的拒绝:{“data”:null,“status”:-1,“config”:{“method”:“post”,“transformrequest”:[null],“transformresponse”:[null],“jsonpcallbackparam”:“callback”,“url”:“http://localhost:3000/lvl/2/data

  • 我正在学习春靴和反应现在。 book.js bookresourceimp.java

  • 我正在构建一个简单的API来测试数据库。当我使用get请求时,一切正常,但如果我更改为post,我会收到“不可处理实体”错误: 以下是FastAPI代码: 然后,我使用javascript的请求 也使用Python 我还尝试解析为 json,使用 utf-8 进行解析,并更改标头。没有什么对我有用。

  • 我正在尝试使用ajax发送post请求,但始终出现以下错误: XMLHttpRequest无法加载http://192.168.1.123:8080。对预检请求的响应无法通过权限改造检查:请求的资源上不存在“访问控制允许源”标头。因此不允许访问源“http://localhost:8080”。 这是我的代码

  • 我正在为一个项目使用Hackerrank API。查看官方文档,点击这里! 在他们的网站上有一个使用UNIREST的例子, 由于我使用的是axios,所以我将其转换为类似的axios代码,如下所示: 我希望这只适用于示例中所示的示例,但它给我带来了以下错误: 请求失败,状态代码为400 错误:请求失败,状态代码为400 在createError(createError.js:16) 在sett(s