Google recaptcha v3 всегда возвращает ошибку - PullRequest
0 голосов
/ 02 сентября 2018

Следуя инструкциям Я получаю действительный токен из своего внешнего интерфейса (см. В инструментах разработчика):

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
}

Тем не менее, я всегда получаю сообщение об ошибке «missing-input-response», «missing-input-secret». Это потому что v3 новый? Все еще ошибки?

1 Ответ

0 голосов
/ 28 октября 2018

Реализовано в документации "post params", а не post body haha.

...