【发布时间】: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