Home

Awesome

Build Status Codacy Code Climate

visualCaptcha-packagist

Packagist composer package for visualCaptcha's backend service

Installation with Composer

You need PHP installed with composer.

composer install emotionloop/visualcaptcha

Run tests

You need PHPUnit installed and then you can run

composer install && phpunit tests

Usage

Initialization

You have to initialize a session for visualCaptcha to inject the data it needs. You'll need this variable to start and verify visualCaptcha as well.

session_start();// Only needed once, at the beginning of your PHP files.
$session = new \visualCaptcha\Session( $namespace );

Where:

Using Cache

You can use a backend Zend-Cache library options to store images on cache and avoid I/O. You'll have to pass options parameter on the constructor as document in https://docs.zendframework.com/zend-cache/storage/adapter/. By default it is disabled and you�ll have to pass true on the constructor on the 5th parameter.

$options = array(
                'adapter' => array(
                    'name'    => 'memory',
                    'options' => array('ttl' => 3600,
                        'namespace' => "captcha-service"),
                ),
                'plugins' => array( 
                    'exception_handler' => array('throw_exceptions' => false),
                ),
            );
        
$captchaWithCache = new \visualCaptcha\Captcha( $this->session,null,null,null, true,$options);

Setting Routes for the front-end

You also need to set routes for /start/:howmany, /image/:index, and /audio/:index. These will usually look like:

// Populates captcha data into session object
// -----------------------------------------------------------------------------
// @param howmany is required, the number of images to generate
$app->get( '/start/:howmany', function( $howMany ) use( $app ) {
    $captcha = new \visualCaptcha\Captcha( $app->session );
    $captcha->generate( $howMany );
    $app->response[ 'Content-Type' ] = 'application/json';
    echo json_encode( $captcha->getFrontEndData() );
} );

// Streams captcha images from disk
// -----------------------------------------------------------------------------
// @param index is required, the index of the image you wish to get
$app->get( '/image/:index', function( $index ) use( $app ) {
    $captcha = new \visualCaptcha\Captcha( $app->session );
    if ( ! $captcha->streamImage(
            $app->response,
            $index,
            $app->request->params( 'retina' )
    ) ) {
        $app->pass();
    }
} );

// Streams captcha audio from disk
// -----------------------------------------------------------------------------
// @param type is optional and defaults to 'mp3', but can also be 'ogg'
$app->get( '/audio(/:type)', function( $type = 'mp3' ) use( $app ) {
    $captcha = new \visualCaptcha\Captcha( $app->session );
    if ( ! $captcha->streamAudio( $app->response, $type ) ) {
        $app->pass();
    }
} );

Validating the image/audio

Here's how it'll usually look:

$session = new \visualCaptcha\Session();
$captcha = new \visualCaptcha\Captcha( $session );
$frontendData = $captcha->getFrontendData();

// If an image field name was submitted, try to validate it
if ( $imageAnswer = $app->request->params( $frontendData[ 'imageFieldName' ] ) ) {
  if ( $captcha->validateImage( $imageAnswer ) ) {
    // Image was valid.
  } else {
    // Image was submitted, but wrong.
  }
// Otherwise an audio field was submitted, so try to validate it
} else if ( $audioAnswer = $app->request->params( $frontendData[ 'audioFieldName' ] ) ) {
  if ( $captcha->validateAudio( $audioAnswer ) ) {
    // Audio answer was valid.
  } else {
    // Audio was submitted, but wrong.
  }
} else {
  // Apparently no fields were submitted, so the captcha wasn't filled.
}

visualCaptcha/Session properties

visualCaptcha/Session methods

visualCaptcha/Captcha properties

visualCaptcha/Captcha methods

You'll find more documentation on the code itself, but here's the simple list for reference.

License

View the LICENSE file.