CakePHPでreCAPTCHAによる画像認証を実装するまで

GWからCakePHPでつくりはじめたWebサービスで、画像認証を実装したいと思って、以前から気になっていたreCAPTCHAを導入した。びっくりするくらい簡単だったけど、意外とreCAPTCHA実装の記事が少ないので、丁寧に解説します。

reCAPTCHAってなんだって人はこちらをどうぞ。

なお、CakePHPは1.2を使ってます。

1. まずは登録

reCAPTCHAを使うにはWebサイトでアカウントを作る必要があります。

まずはhttp://recaptcha.net/へアクセスし、「USE reCAPTCHA ON YOUR SITE」へ。

recaptcha001.png

「Sign up Now!」へ。

recaptcha002.png

「Sign up」へ。

recaptcha002_2.png

ユーザー名、パスワード、パスワード再入力、連絡先メールアドレス、そしてもちろんreCAPTCHAによる画像認証を入力して「Sign up Now!」へ。

recaptcha003.png

次に、どのドメインでreCAPTCHAを使うかを聞いてきます。たぶんここで入れたドメイン以外からの検証リクエストは受け付けないんでしょう(少なくともlocalhostからは受付けてましたが)。

親ドメインを入れとけばサブドメインでも使えるし、一つのアカウントで複数のドメインを登録できるし、大量のドメインから使うんだったら「Enable this key on all domains (global keys)」にチェックを入れとけば、ドメインの制限は受けないようです。

入力したら「Create Key」へ。

recaptcha004.png

これで登録完了です!

recaptcha005.png

「Public Key」(公開鍵)「Private Key」(秘密鍵)は実装のさいに使用します。「Public Key」(公開鍵)は別に誰に知られてもまったく問題ないですが、「Private Key」(秘密鍵)は絶対に知られないようにしましょう(でないと認証の意味ないです)。

なお、ここで表示される情報はメニューの「MY ACCOUNT」からいつでも確認できます。

2. PHP用のライブラリを用意する

メニューの「RESOURCES」に「PHP」の項目があるので、そこへ。

recaptcha006.png

Download」へ。

recaptcha007.png

Google Codeに飛ぶのでこのzipをダウンロードします。

recaptcha008.png

zipを展開するといくつかファイルが出てきます。

この中の「recaptchalib.php」をCakePHPの/app/vendors下に置いておきます。

3. View側の実装

View側では****の中に入るように、以下のコードを書きます。

App::import('Vendor', 'recaptchalib');
$publickey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
echo recaptcha_get_html($publickey);

1行目はさきほどコピーしたライブラリの読み込み。

2行目はreCAPTCHAのPublic Key (公開鍵)を書きます。

3行目はreCAPTCHAのウィジェットを表示します。

たったこれだけでOK!

4. Controller側の実装

Controller側では先ほどのViewのformから呼ばれるアクション内に以下のコードを書きます。

App::import('Vendor', 'recaptchalib');
$privatekey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
$resp = recaptcha_check_answer(
            $privatekey,
            $_SERVER["REMOTE_ADDR"],
            $this->params['form']['recaptcha_challenge_field'],
            $this->params['form']['recaptcha_response_field']);

1行目はやはりライブラリの読み込み。

2行目はreCAPTCHAのPrivate Key (秘密鍵)を書きます。

3行目はユーザーが入力した文字列を検証します。

これで$resp->is_validに検証結果が入るので、あとはお好きなように。