Search code examples
apirestrecaptchalumen

Lumen Google reCAPTCHA validation


I already seen some tuts and example about it and I have implemented it somehow. Method in controller looks like this:

The logic used is just php and I would like to use more a lumen/laravel logic and not just simple vanilla php. Also I have tried and did not worked anhskohbo / no-captcha

public function create(Request $request)
{
    try {

        $this->validate($request, [
            'reference'            => 'required|string',
            'first_name'           => 'required|string|max:50',
            'last_name'            => 'required|string|max:50',
            'birthdate'            => 'required|before:today',
            'gender'               => 'required|string',
            'email'                => 'required|email|unique:candidates',
            'g-recaptcha-response' => 'required',
        ]);

        //Google recaptcha validation
        if ($request->has('g-recaptcha-response')) {

            $secretAPIkey = env("RECAPTCHA_KEY");

            // reCAPTCHA response verification
            $verifyResponse = file_get_contents('https://www.google.com/recaptcha/api/siteverify?secret='.$secretAPIkey.'&response='.$request->input('captcha-response'));
                
            $response = json_decode($verifyResponse);

            if ($response->success) {

                //Form submission
                //Saving data from request in candidates

                $candidate = Candidate::create($request->except('cv_path'));

                $response = array(
                    "status" => "alert-success",
                    "message" => "Your mail have been sent."
                );

            } else {

                $response = array(
                    "status" => "alert-danger",
                    "message" => "Robot verification failed, please try again."
                );
                  
            }

        }
        
    } catch(Exception $e) {

        return response()->json($e->getMessage());
    }

    return response()->json(['id' => $candidate->id, $response]);

}

Solution

  • Okey. Google has an package for this:reCAPTCHA PHP client library

    just: composer require google/recaptcha "^1.2"

    and in your method inside controller:

    $recaptcha = new \ReCaptcha\ReCaptcha(config('app.captcha.secret_key'));
    
    $response = $recaptcha->verify($request->input('g-recaptcha-response'), $_SERVER['REMOTE_ADDR']);
    
    if ($response->isSuccess()) { 
    
       //Your logic goes here
        
    } else {
        $errors = $response->getErrorCodes();
    }
    

    config('app.captcha.site_key') means that I got the key from from config/app.php and there from .env file.

    If you have not config folder, you should create it, also create app.php file same as in laravel.