Package Data | |
---|---|
Maintainer Username: | hugocabral |
Maintainer Contact: | hello@emotionloop.com (emotionLoop) |
Package Create Date: | 2015-01-07 |
Package Last Update: | 2015-11-10 |
Language: | PHP |
License: | MIT |
Last Refreshed: | 2024-12-15 15:08:58 |
Package Statistics | |
---|---|
Total Downloads: | 162 |
Monthly Downloads: | 0 |
Daily Downloads: | 0 |
Total Stars: | 6 |
Total Watchers: | 2 |
Total Forks: | 2 |
Total Open Issues: | 1 |
A visual and cleaner alternative to the traditional text based Captcha
This is a Laravel version using jQuery of the Captcha alternative from http://visualcaptcha.net VisualCaptcha is the easiest to implement secure Captcha with images instead of text (and mobile-friendly).
PHP 5.3
{
"require": {
"hugocabral/visualcaptcha-laravel-jquery": "~1.0"
}
}
// app.php
'Captcha' => 'visualCaptcha\Captcha',
'SessionCaptcha' => 'visualCaptcha\SessionCaptcha',
composer update
Note: This implementation uses Localization from Laravel (Languages). No need to freak out. Its easy to use and you can check the explanation in this readme under Localization.
// routes.php
// Check Locale selected and show demo view. If your app will be English only, you can remove: $lang = Config::get('app.locale'); and remove: ,compact('lang').
Route::get('/', array('as' => 'demo', function()
{
$lang = Config::get('app.locale');
return View::make('demo', compact('lang'));
}));
// Send method to validate captcha
Route::post('captchacheck','CaptchaController@send');
// Routes for app.visualcaptcha.js.
Route::group(array('prefix' => 'captcha'), function()
{
Route::get('start/{howmany}', array('as' => 'captcha/start', 'uses'=>'CaptchaController@start'));
Route::get('audio/{type?}', array('as' => 'captcha/audio', 'uses'=>'CaptchaController@audio'));
Route::get('image/{index?}', array('as' => 'captcha/image', 'uses'=>'CaptchaController@image'));
});
// app/controllers/CaptchaController.php
class CaptchaController extends BaseController {
/**
* Generate a Captcha
* @return Response
*/
public function start($howmany)
{
$session = new SessionCaptcha();
$captcha = new Captcha($session);
$captcha->generate($howmany);
return Response::json($captcha->getFrontEndData());
}
/**
* Get an audio file
* @param string $type Song type (mp3/ogg)
* @return File
*/
public function audio($type = 'mp3')
{
$session = new SessionCaptcha();
$captcha = new Captcha($session);
return $captcha->streamAudio(array(), $type);
}
/**
* Get an image file
* @param string $index Image index
* @return File
*/
public function image($index)
{
$session = new SessionCaptcha();
$captcha = new Captcha($session);
return $captcha->streamImage(array(), $index, 0 );
}
/**
* Check if the Captcha result is good
* @return Mixed
*/
public function send()
{
$data = Input::all();
//Validation rules
$rules = array(
'name' => 'required'
);
//Validate data
$validator = Validator::make($data, $rules);
//If everything is correct than run passes.
if ($validator->passes())
{
$session = new SessionCaptcha();
$captcha = new Captcha($session);
$frontendData = $captcha->getFrontendData();
if (!$frontendData)
{
return Redirect::back()->withInput()->withErrors(array('message' => Lang::get('text.captcha.none')));
} else
{
// If an image field name was submitted, try to validate it
if ($imageAnswer = Input::get($frontendData['imageFieldName']))
{
if ($captcha->validateImage($imageAnswer))
{
// Return true if the result is correct
(... DO ACTION HERE, ex send email, update db...)
// This return back to form to show sucess, thats why i use status=1
return Redirect::back()->with('status', 1);
} else
{
return Redirect::back()->withInput()->withErrors(array('message' => Lang::get('text.captcha.image')));
}
} else if ($audioAnswer = Input::get($frontendData['audioFieldName']))
{
if ($captcha->validateAudio($audioAnswer))
{
// Return true if the result is correct
(... DO ACTION HERE, ex send email, update db...)
// This return back to form to show sucess, thats why i use status=1
return Redirect::back()->with('status', 1);
} else
{
return Redirect::back()->withInput()->withErrors(array('message' => Lang::get('text.captcha.audio')));
}
} else
{
return Redirect::back()->withInput()->withErrors(array('message' => Lang::get('text.captcha.incomplete')));
}
}
} else
{
//return "contact form with errors";
return Redirect::back()->withErrors($validator)->with('status', 2);;
}
}
}
Note: The Lang::get('xxx.xxx.xxx') code is the implementation of Localization (Languages). If your app will be English only, you can hardcore and replace this with your messages/errors.
// contact.blade.php
{{ HTML::script(js/jquery.min.js) }}
{{ HTML::script(js/visualcaptcha.jquery.js) }}
{{ HTML::script(js/app.js') }}) }}