Рабочий пример рекапчи в метеоре

Может ли кто-нибудь помочь с рабочим примером рекапчи в метеоре без использования фреймов? Я не могу запустить сценарии recaptcha, даже когда пытаюсь запустить их из client.js с помощью jquery append.


person Florin Dobre    schedule 07.03.2014    source источник
comment
Тег сценария recaptcha отображается в DOM, но внутри него я получаю: Reload the page to get the source for: google.com/recaptcha/api/…   -  person Florin Dobre    schedule 07.03.2014


Ответы (1)


Проведя некоторые исследования, я обнаружил, что мне пришлось вручную интегрировать reCaptcha.

Код на стороне клиента:

HTML:

<form id="mySecuredForm" novalidate>
        <!-- labels and inputs here -->

        <div class="row">
            <div id="captcha-container">
                <div id="rendered-captcha-container">loading...</div>
            </div>
        </div>

        <div class="row">
            <button type="submit" id="submit" class="submit-button">Submit</button>
        </div>
</form>

JS

if (Meteor.isClient) {

Template.myTemplate.rendered = function() {

     $.getScript('http://www.google.com/recaptcha/api/js/recaptcha_ajax.js', function() {
         Recaptcha.create('add_your_public_key_here', 'rendered-captcha-container', {
             theme: 'red',
             callback: Recaptcha.focus_response_field
         });
     });

}

Template['myTemplate'].events({
    'submit form#mySecuredForm': function(event) {
        event.preventDefault();
        event.stopPropagation();

        var formData = {
            captcha_challenge_id: Recaptcha.get_challenge(),
            captcha_solution: Recaptcha.get_response()
            //add the data from form inputs here
        };

        Meteor.call('submitMySecuredForm', formData, function(error, result) {

            if (result.success) {
                //set session vars, redirect, etc

            } else {
                Recaptcha.reload();

                // alert error message according to received code
                switch (result.error) {
                    case 'captcha_verification_failed':
                        alert('captcha solution is wrong!');
                        break;
                    case 'other_error_on_form_submit':
                        alert('other error');
                        break;
                    default:
                        alert('error');
                }

            }
        });
    }

Код на стороне сервера

function verifyCaptcha(clientIP, data) {

var captcha_data = {
    privatekey: 'add_private_key_here',
    remoteip: clientIP
    challenge: data.captcha_challenge_id,
    response: data.captcha_solution
};

var serialized_captcha_data =
    'privatekey=' + captcha_data.privatekey +
        '&remoteip=' + captcha_data.remoteip +
        '&challenge=' + captcha_data.challenge +
        '&response=' + captcha_data.response;
var captchaVerificationResult = null;
var success, parts; // used to process response string

try {
    captchaVerificationResult = HTTP.call("POST", "http://www.google.com/recaptcha/api/verify", {
        content: serialized_captcha_data.toString('utf8'),
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded',
            'Content-Length': serialized_captcha_data.length
        }
    });
} catch(e) {
    return {
        'success': false,
        'error': 'google_service_not_accessible'
    };
}

parts = captchaVerificationResult.content.split('\n');
success = parts[0];

if (success !== 'true') {
    return {
        'success': false,
        'error': 'captcha_verification_failed'
    };
}

return {
    'success': true
};
}

Meteor.methods({
"submitMySecuredForm": function(data) {

    //!add code here to separate captcha data from form data.

    var verifyCaptchaResponse = verifyCaptcha(this.connection.clientAddress, data);

    if (!verifyCaptchaResponse.success) {
        console.log('Captcha check failed! Responding with: ', verifyCaptchaResponse);
        return verifyCaptchaResponse;
    }

    console.log('Captcha verification passed!');

    //!add code here to process form data

    return {success: true};
});

Также есть возможность прослушать событие публикации на стороне сервера. HTTP-вызовы могут выполняться синхронно, как указано выше, или асинхронно с fibers/futures.

HTTP-запрос на стороне сервера к API Google был вдохновлен: https://github.com/mirhampt/node-recaptcha/blob/master/lib/recaptcha.js

person Florin Dobre    schedule 20.03.2014