【问题标题】:Re-captcha token verification fails in AWS, but not in vercel在 AWS 中重新验证令牌验证失败,但在 vercel 中没有
【发布时间】:2022-02-18 14:11:37
【问题描述】:

下面是我的 Next.js(后端 API)代码,用于验证 recaptcha 令牌(从客户端创建)并发送邮件。

import { NextApiRequest, NextApiResponse } from "next";
import NextCors from 'nextjs-cors';
import { recaptchaAxios } from "../../axios/axiosBackend";
import sendGridMail from '@sendgrid/mail';
sendGridMail.setApiKey(process.env.SENDGRID_API_KEY);

interface FormData {
    contactName: string;
    contactEmail: string;
    contactPhone: string;
    contactSubject: string;
    contactMessage: string;
    token: string;
}

export default async (req: NextApiRequest, res: NextApiResponse) => {

  await NextCors(req, res, {
    // Options
    methods: ['GET','POST'],
    origin: '*',
    optionsSuccessStatus: 200, // some legacy browsers (IE11, various SmartTVs) choke on 204
 });

  const formData: FormData = req.body;
  console.log("form Data >>>>>>>>>>>>>>",formData)
  const human = await validateHuman(formData.token);

  if (!human) {
    res.status(400);
    return res.json({ success: false, errors: ["You are not authenticated"] });
  }

  const message = {
    to: process.env.SENDGRID_MAIL_RECEIVER, 
    from: process.env.SENDGRID_MAIL_SENDER, // Change to your verified sender
    subject: formData.contactSubject,
    text: `Name: ${formData.contactName}\n 
           Contact: ${formData.contactPhone} \n
           Email: ${formData.contactEmail} \n
           Message: ${formData.contactMessage}`,
    html: `Name: ${formData.contactName}
           Contact: ${formData.contactPhone}
           Email: ${formData.contactEmail}
           Message: ${formData.contactMessage}`,
  }

  try {
    await sendGridMail.send(message);
    res.status(200);
    return res.json({ success: true, errors: [] });
  } catch (error) {
    console.log(error);
    res.status(500);
    return res.json({ success: false, errors: ['Error occured while trying to send your details. Please contact your Administrator.']});
  }
};

async function validateHuman(token: string): Promise<boolean> {
  const secret = process.env.RECAPTCHA_SECRET_KEY;
  const response = await recaptchaAxios.post(`/siteverify?secret=${secret}&response=${token}`,{}, {});
  const success = response.data['success'];
  console.log("server siteverify >>>>>>>>>>>>>",response);
  return success;
}

recaptchaAxios 的 baseURL 如下

const recaptchaAxios = axios.create({
  baseURL: `https://www.google.com/recaptcha/api`,
});

我已经在 vercel 以及使用 AWS Amplify 中部署了相同的代码。

vercel 中调用上述邮件 API 时,会验证 Recaptcha 令牌并发送邮件。 但不幸的是,在 AWS 中它给出了错误

{ 成功:false,错误:[“您未通过身份验证”] }

我已经在 AWS 中添加了我在 vercel 中拥有的所有环境变量,并且值是相同的。 所有域都添加到网站的 reCaptch v3 控制台中。

所以在这一点上,我被困在 AWS 中为什么会给出错误,但对于相同的代码库却没有 vercel

我在 AWS 中有什么遗漏吗??

干杯

【问题讨论】:

    标签: node.js amazon-web-services next.js aws-amplify recaptcha-v3


    【解决方案1】:

    我的第一个指针是 console.log 脚本加载时的环境变量,每次触发 recaptcha 验证时也是如此。通过这种方式,您可以确保 ENV 变量都正确加载。你会惊讶于有一个小的区分大小写的错字,让你没有一个重要的环境变量。

    否则,我会检查是否需要在 AWS Amplify 上允许传出流量(防火墙规则),但这不太常见,因为 AWS Amplify 会生成一个公共站点。

    【讨论】:

    • 您好,尽管 RECAPTCHA_SECRET_KEY 在 AWS 的环境变量中可用,但 process.env.RECAPTCHA_SECRET_KEY 仍被视为 null。有什么想法吗??
    【解决方案2】:

    问题出在下面的代码中

    const secret = process.env.RECAPTCHA_SECRET_KEY;
    

    即使 RECAPTCHA_SECRET_KEY 在 AWS 的环境变量中可用,它也无法访问。

    修复是在 next.config.js 文件中引入这个键

    module.exports = {
      images: {
        domains: [],
      },
      env: {
        RECAPTCHA_SECRET_KEY: process.env.RECAPTCHA_SECRET_KEY,
      },
    };
    

    这样就解决了问题

    【讨论】:

      猜你喜欢
      • 2021-08-28
      • 2022-09-25
      • 2022-10-19
      • 1970-01-01
      • 2020-10-28
      • 1970-01-01
      • 2014-11-12
      • 1970-01-01
      • 2018-07-23
      相关资源
      最近更新 更多