Как использовать VisualCaptcha с AngularJS и slimPHP в RESTful

Поэтому я используюAngularJS на фронтенде и SlimPHP на бэкэнд с REST URL. Я пытаюсь использовать VisualCaptch и я следовал инструкциям на стороне PHP, и это, кажется, работает на бэкэнде, я сделал простой Angular dataService, вызывающий URL и отображающий его на консоли, но я просто не понимаю, как соединить его с Angular, я также скачал эта часть, но когда я создаю HTML и позвонить captcha внутри <div>, Ну, на самом деле позвольте мне объяснить одну из проблем, это неверный URL-адрес, который пытается запустить Angular, но я просто не знаю, как его настроить, есть ли опция для? Итак, позвольте мне показать код, который у меня есть … Кстати, я использую Controller as vm синтаксис, так что вы не найдете $scope в моем коде.

HTML:

<div captcha options="vm.captchaOptions"></div>

Код контроллера AngularJS:

// this work as a dataService call to SlimPHP
dataService.getCaptchaHowMany().then(function(data) {
console.debug(data);
});

// where does my dataService call goes in here???
vm.captchaOptions = {
imgPath: 'vendors/visual-captcha/img/',
captcha: { numberOfImages: 5 },
init: function ( captcha ) {
vm.captcha = captcha;
}
};

Маршруты SlimPHP, на которых я знаю, что они работают

# Captcha Routes
$app->get('/captcha/start/:howMany', function($howMany) use ($app) { CaptchaController::getCaptchaHowMany($app, $howMany); });
$app->get('/captcha/audio(/:type)', function($type = 'mp3') use ($app) { CaptchaController::getCatpchaDiskAudioStreaming($app, $type); });
$app->get('/captcha/image/:index', function($index) use ($app) { CaptchaController::getCatpchaDiskImageStreaming($app, $index); });
$app->post('/captcha/try', function() use ($app) { CaptchaController::postCatchaTryValidate($app); });

Когда я скопировал пример VisualCaptcha с Angular и запустил код, он показывает неверный вызов url (плохой, потому что мой SlimPHP Api находится в другом месте). Так что плохой URL-вызов выглядит так:

GET http://localhost/myproject/user/start/5

Но чтобы правильно позвонить моему SlimPHP Api маршруты это должно быть так
GET http://localhost/myproject/api/captcha/start/5

Так, где я настраиваю маршруты для Angular с VisualCaptcha ??? Я также приложил результат моего правильного URL-адреса, так что я думаю, что мой бэкэнд (SlimPHP) работает правильно, это просто неправильная настройка углового URL-адреса в контроллере.
введите описание изображения здесь

РЕДАКТИРОВАТЬ
Я получил немного дальше, я обнаружил, что мы можем установить url внутри captchaOptions который теперь делает правильный вызов моему SlimPHP URL-адреса API со следующим

vm.captchaOptions = {
imgPath: 'vendors/visual-captcha/img/',
captcha: {
numberOfImages: 5,
url: 'api/captcha'
},
// use init callback to get captcha object
init: function ( captcha ) {
vm.captcha = captcha;
}
};

У меня сейчас проблема в том, что изображения не отображаются. Предполагается, что изображения приходят из PHP или из Angular на стороне клиента? Какая папка должна содержать все изображения? Я на самом деле получаю это сообщение об ошибке в консоли:

HTTP "Content-Type" of "text/html" is not supported. Load of media resource http://localhost/investing/api/captcha/audio?r=353oeaysbjg failed.

Я на самом деле не хочу аудио, хотя это дает мне эту аудио ошибку, я просто хочу использовать изображения, вот и все. Может ли кто-нибудь помочь мне, пожалуйста!

2

Решение

Пройдя 2 дня, я наконец заработал. Я должен был сделать несколько изменений кода … так что вот список изменений:

Во-первых, мне не хватало переменной сеанса внутри моего SlimPHP приложение:

// Inject Session closure into app
$app->session = function() use( $app ) {
if ( $namespace = $app->request->params( 'namespace' ) ) {
$session = new \visualCaptcha\Session( 'visualcaptcha_' . $namespace );
} else {
$session = new \visualCaptcha\Session();
}
return $session;
};

Затем изменил код HTML для работы с Bootstrap вместо FoundationТакже добавлена ​​кнопка 2, чтобы проверить, заполнена ли она и действительна ли она:

<div class="form-group">
<label class="control-label col-sm-5">Visual Captcha Messages</label>
<div class="col-sm-7" id="status-message">
<div class="alert" ng-class="{ 'alert-danger': (vm.valid === false), 'alert-success': (vm.valid === true) }" role="alert" ng-show="vm.status !== null">
<div ng-class="{ 'glyphicon glyphicon-remove-sign': (vm.valid === false), 'glyphicon glyphicon-ok-sign': (vm.valid === true) }" ></div>
{{ vm.status }}
</div>
</div>
</div>

<div class="form-group">
<label class="control-label col-sm-5">Visual Captcha</label>
<div class="col-sm-7" captcha options="vm.captchaOptions"></div>
</div>

<button type="button" class="btn" ng-click="vm.isVisualCaptchaFilled()">Check if visualCaptcha is filled</button>
<button type="button" class="btn" ng-click="vm.isVisualCaptchaValid()">Validate Catpcha</button>

тогда внутри моего AngularJS контроллер с помощью Controller as vm синтаксис:

vm = this;
vm.captcha = {};
vm.captchaOptions = {
imgPath: 'vendors/visual-captcha/img/', // vendors folder on Angular side, only used for "refresh" and "audio" buttons
captcha: {
numberOfImages: 5,
url: 'api/captcha'                  // url for SlimPHP route calls
},
// use init callback to get captcha object
init: function ( captcha ) {
vm.captcha = captcha;
}
};

// vm public functions revealing
vm.isVisualCaptchaFilled = isVisualCaptchaFilled;
vm.isVisualCaptchaValid = isVisualCaptchaValid;

function isVisualCaptchaFilled() {
if ( vm.captcha.getCaptchaData().valid ) {
window.alert( 'visualCaptcha is filled!' );
} else {
window.alert( 'visualCaptcha is NOT filled!' );
}
}

function isVisualCaptchaValid() {
// we will post the captcha image field name and image field value
var postData = {
fieldName: vm.captcha.getCaptchaData().name,
fieldValue: vm.captcha.getCaptchaData().value
};

dataService.isVisualCaptchaValid(postData)
.then(function(data) {
// Show success/error messages
if ( data.status === 'noCaptcha' ) {
vm.valid = false;
vm.status = 'visualCaptcha was not started!';
} else if ( data.status === 'validImage' ) {
vm.valid = true;
vm.status = 'Image was valid!';
} else if ( data.status === 'failedImage' ) {
vm.valid = false;
vm.status = 'Image was NOT valid!';
} else if ( data.status === 'validAudio' ) {
vm.valid = true;
vm.status = 'Accessibility answer was valid!';
} else if ( data.status === 'failedAudio' ) {
vm.valid = false;
vm.status = 'Accessibility answer was NOT valid!';
} else if ( data.status === 'failedPost' ) {
vm.valid = false;
vm.status = 'No visualCaptcha answer was given!';
}
})
.then(function() {
vm.captcha.refresh();
});
}

тогда тоже пришлось переписать try маршрут внутри SlimPHP приложение:

// Try to validate the captcha
// -----------------------------------------------------------------------------
$app->post( '/try', function() use( $app ) {
$captcha = new \visualCaptcha\Captcha( $app->session );
$frontendData = $captcha->getFrontendData();
$isCaptchaValid = false;
$namespace = '';
$status = '';

//POST variables, they come as a JSON encoded inside the POST
$jsonPostFields = $app->request();
$post = json_decode($jsonPostFields->getBody(), $associativeArray = true);

// Load the namespace into url params, if set
if ( isset($post['namespace']) ) {
$namespace = $post['namespace'];
}
if ( ! $frontendData ) {
$status = 'noCaptcha';
} else {
// If an image field name was submitted, try to validate it
if(isset($post["fieldName"]) && $post["fieldName"] === $frontendData['imageFieldName']) {
$imageAnswer = $post["fieldValue"];
if ( $captcha->validateImage( $imageAnswer ) ) {
$isCaptchaValid = true;
$status = 'validImage';
} else {
$status = 'failedImage';
}
} else if(isset($post["fieldName"]) && $post["fieldName"] === $frontendData['audioFieldName']) {
$audioAnswer = $post["fieldValue"];
if ( $captcha->validateAudio( $audioAnswer ) ) {
$isCaptchaValid = true;
$status = 'validAudio';
} else {
$status = 'failedAudio';
}
} else {
$status = 'failedPost';
}
$howMany = count( $captcha->getImageOptions() );
$captcha->generate( $howMany );
}
echo json_encode(array("isCaptchaValid" => $isCaptchaValid, "status" => $status));
} );

Пожалуйста, обратите внимание, что с помощью dataService был только для тестирования & в целях развития, вы должны вместо этого проверить VisualCaptcha на сервере перед сохранением формы, которая также находится на сервере. Так что в теории у вас будет только 1 вызов в Angular, который является вызовом сохранения формы через dataService, то на стороне сервера должно быть 2 вещи, которые должны произойти (1 — проверка кода, 2 — форма сохранения)

Я также изменил данные в post потому что мне не нравится, как они сделали свой пример, я никогда не публикую форму непосредственно в приложении AngularJS SPA, вместо этого я предпочитаю использовать dataService вызванный ng-click вот почему я должен был определить свой собственный postData переменная.

Со всеми этими изменениями … он наконец работает на обоих изображениях & Аудио !!!

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector