问题
What I'm trying to do is prevent the user from bypassing the captcha. Right now on the contact form a user can fill all the fields except captcha and have the form still submit
Here's the webpage that's displaying the contact form -> here's the page -> http://ec2-52-5-104-185.compute-1.amazonaws.com/contact
Here's the code that's displaying this contact form->
{{# autoForm schema='ContactSchema' id="contactForm" type="method" meteormethod="sendContact"}}
{{> afQuickField name="categoryId"}}
{{> afQuickField name="email" }}
{{> afQuickField name="title" }}
{{> afQuickField name="message" rows=8 }}
<!-- googles reCaptcha , i'm using ayue:recaptcha package to render this captcha -->
{{> reCAPTCHA}}
{{/ autoForm }}
Here's the client side JS meteor calls for the captcha
Template.contact.events({
'submit form': function(e) {
e.preventDefault();
var formData = {
//get the data from your form fields
};
//get the captcha data
var recaptchaResponse = grecaptcha.getResponse();
Meteor.call('formSubmissionMethod', formData, recaptchaResponse, function(error, result) {
if (error) {
console.log('There was an error: ' + error.reason);
} else {
console.log('Success!');
}
});
}
});
And here's the server side code that's grabbing the sendContact method from the contact form and also the recaptcha meteor.call method
Meteor.methods({
formSubmissionMethod: function(formData, recaptchaResponse) {
var verifyCaptchaResponse = reCAPTCHA.verifyCaptcha(recaptchaResponse, this.connection.clientAddress);
if (!verifyCaptchaResponse.success) {
console.log('reCAPTCHA check failed!', verifyCaptchaResponse);
throw new Meteor.Error(422, 'reCAPTCHA Failed: ' + verifyCaptchaResponse.error);
} else {
console.log('reCAPTCHA verification passed!');
}
//do stuff with your formData
return true;
},
sendContact: function (doc) {
check(doc, ContactSchema);
var html = "<b>" + doc.title + "</b><br>"
+ "<b>" + doc.email + "</b><br><br>"
+ doc.message.escape();
this.unblock();
Email.send({
to: orion.dictionary.get('contact form.email') && doc.categoryId,
from: orion.config.get('MAIL_FROM'),
// subject: orion.dictionary.get('global.siteName') + ' - Contact',
subject: doc.title + ' - Contact',
replyTo: doc.email,
html: html
})
}
});
回答1:
Rather than throw the error on your server side method, just return the success value, like:
verifyCaptchaResponse = reCAPTCHA.verifyCaptcha(this.connection.clientAddress, doc.gRecaptchaResponse);
if (verifyCaptchaResponse.data.success === false) {
return verifyCaptchaResponse.data;
}
Than back on the client in the callback, do something like:
if (result && result.success === false) {
//CAPTCHA failed
Modal.show('recaptcha');
}
return false;
And rather than use a 'submit form' event, use AutoForm.hooks, then use the onSubmit method inside AutoForm.hooks for your form.
来源:https://stackoverflow.com/questions/31993517/how-do-i-integrate-googles-recaptcha-inside-aldeedautoform-meteor