Google reCAPTCHA, ошибка 405 и проблема CORS

Я использую AngularJS и пытаюсь работать с reCAPTCHA Google, я использую метод «Явно визуализировать виджет reCAPTCHA» для отображения reCAPTCHA на моей веб-странице,

HTML-код –

<script type="text/javascript">
    var onloadCallback = function() 
    {
        grecaptcha.render('loginCapcha', {
            'sitekey' : 'someSiteKey',
            'callback' : verifyCallback,
            'theme':'dark'

        });
    };

    var auth='';
    var verifyCallback = function(response) 
    {
       //storing the Google response in a Global js variable auth, to be used in the controller
        auth = response;

        var scope = angular.element(document.getElementById('loginCapcha')).scope();
        scope.auth();
    };
</script>

<div id="loginCapcha"></div>


<script src="https://www.google.com/recaptcha/api.js?onload=onloadCallback&render=explicit" async defer></script>

На данный момент я могу добиться необходимой функциональности, независимо от того, является ли пользователь человеком или ботом.
Согласно приведенному выше коду, у меня есть функция обратного вызова с именем 'verifyCallback' в моем код,
который сохраняет ответ, созданный Google, в глобальной переменной с именем 'auth'.

Теперь последняя часть reCAPCHA вызывает Google API,
с "https://www.google.com/recaptcha/api/siteverify" в качестве URL-адреса и методом POST,
передавая ему секретный ключ и >Ответ создан Google, что я и сделал в приведенном ниже коде.

Мой контроллер —

_myApp.controller('loginController',['$rootScope','$scope','$http',
 function($rootScope,$scope,$http){

    var verified = '';

    $scope.auth = function()
    {
        //Secret key provided by Google
        secret = "someSecretKey";

       /*calling the Google API, passing it the Secretkey and Response,
       to the specified URL, using POST method*/

        var verificationReq = {

            method: 'POST',
            url: 'https://www.google.com/recaptcha/api/siteverify',
            headers: {
                 'Access-Control-Allow-Origin':'*'
             },
            params:{
                secret: secret,
                response: auth
            }

        }


        $http(verificationReq).then(function(response) 
        {
            if(response.data.success==true)
            {
                console.log("Not a Bot");
                verified = true;
            }
            else
            {
                console.log("Bot or some problem");
            }

        }, function() {
           // do on response failure
        });
    }

Итак, проблема, с которой я на самом деле сталкиваюсь, заключается в том, что я не могу попасть по URL-адресу Google.
Ниже приведен снимок экрана с запросом, который я отправляю, и ошибкой.

Запрос сделан –
введите здесь описание изображения

Ответ об ошибке — введите здесь описание изображения

Насколько я понимаю, это связано с запросом CORS и Preflight.
Итак, что я делаю неправильно? Как решить эту проблему?


person Ani    schedule 01.05.2016    source источник
comment
Я добавил «Açcess-Control-Allow-Origin»: «*» в качестве заголовка в моем запросе? Что мне не хватает? Пожалуйста помоги   -  person Ani    schedule 01.05.2016
comment
Так что это должно обрабатываться на стороне сервера? Меня это больше смущает :'( Можно ли это решить на стороне клиента с помощью кода, который я написал?   -  person Ani    schedule 01.05.2016
comment
Нет, это должно быть обработано на сервере. Обойти это невозможно.   -  person marvinhagemeister    schedule 01.05.2016
comment
Вы не можете передать секрет клиенту и создавать запросы оттуда. Это было бы нарушением безопасности.   -  person Wiktor Zychla    schedule 01.05.2016
comment
О, хорошо, так что я должен сделать запрос из скрипта на стороне сервера, а не со стороны клиента?   -  person Ani    schedule 01.05.2016
comment
Да, вот как это должно работать.   -  person Wiktor Zychla    schedule 01.05.2016


Ответы (1)


Как указано в документации Google https://developers.google.com/recaptcha/docs/verify

На этой странице объясняется, как проверить ответ пользователя на запрос reCAPTCHA из серверной части вашего приложения.

Проверка инициируется сервером, а не клиентом.

Это дополнительный шаг безопасности для сервера, чтобы убедиться, что запросы, поступающие от клиентов, являются законными. В противном случае клиент может подделать ответ, и сервер будет слепо полагаться на то, что клиент является проверенным человеком.

person Trevor Daniels    schedule 11.05.2016