0

按照说明,我从前端获得了一个有效的令牌(可以在开发工具中看到):

window.grecaptcha
  .execute(captchaPkey, { action: 'contact' })
  .then((token) => {
    // this is what I POST to my API

所以在我的 React 前端:

send = (event) => {
  event.preventDefault()
  this.setState({ busy: true })
  window.grecaptcha.ready(() => {
    window.grecaptcha
      .execute(captchaPkey, { action: 'contact' })
      .then((token) => {
        // successfully get token
        const payload = {
          token,
          name: this.state.name,
          to: this.props.to,
          email: this.state.email,
          message: this.state.message,
        }
        // now I'm sending the payload to my API
        // My API 
        update(`${api}/contact/`, {
          method: 'POST',
          body: JSON.stringify(payload)
        }, null)
          .then(data => {
            this.setState({ busy: false, result: 'Email sent' });
          })
          .catch(error => {
            this.setState({ busy: false, error: error.message });
          });
      })
  })
}

我的 API 控制器

async function verifyCaptcha(token) {
  return await axios.post('https://www.google.com/recaptcha/api/siteverify', {
    secret: process.env.CAPTCHA_PKEY,
    response: token
  })
}

async function contact({ token, to, name, email, message }) {
  const result = await verifyCaptcha(token)
  if (!result || !result.data || !result.data.success) {
    // always get an error here
    throw new Error('Invalid captcha')
  }
  let targetEmail = 'default@emailaddress'
  if (to !== 'admin') {
    const user = await User.findOne({ username: to }, { email }).exec()
    if (!user) {
      throw new Error('User does not exist')
    }
    targetEmail = user.email
  }

  // rest of send
}

在我的 API POST 端点上,发送到https://www.google.com/recaptcha/api/siteverify的正文为:

{
   secret: process.env.CAPTCHA_PKEY,
   response: token
}

然而我总是得到“缺少输入响应”,“缺少输入秘密”错误。这是因为 v3 是新的吗?还是bug?

4

1 回答 1

0

在文档中实现它声明“post params”而不是post body haha​​。

于 2018-10-28T15:13:23.620 回答