2011年01月31日

CakePHP で ReCAPTCHA を使う際の Validate

MVC という点から見たらおかしな話…あれ?わからん。

ちょっと ReCAPTCHA に触る機会があったので
CakePHPでreCAPTCHAによる画像認証を実装するまで - 情報と音楽

こちらを見たりしながら ReCAPTCHA をいじっていたんですけど、ユーザー側からしたら CAPTCHA も入力値(しかも一番厄介なもの)なので、他の値と一緒に Validate してみてもいいんじゃない?という話。以下、上記サイトを参照。

いきなり例。CakePHP の blog チュートリアル と同じスキーマから bake していくと

app/posts
index.png

app/posts/add
add.png

こんな感じの画面ができます。App/models/post.php に validation を書いておけば

valid_add.png

valid_error.png

こんなエラーメッセージを表示するように出来るのですが、 CAPTCHA だけ別扱いにするのはユーザから見ると少し不便な気がします。
そこで、上記サイトのコードを参考に少しいじっていってみたいと思います。

App/views/posts/add.ctp に
App::import('Vendor', 'recaptchalib');
$publickey = 'xxxxxxxxxxxxxxxxxxxxxxxxxxx';
echo recaptcha_get_html($publickey);
echo $this->Form->error('recaptcha_response_field');
このようにエラー出力を追加します。

これで view は出来ました。
add_recaptcha.png

次に Controller ですが、 App/controllers/posts_controller.php の add() に
if (!empty($this->data)) {
	// ここから追加
	// ここで $this->data に入力値を渡す.
	$this->data['Post']['recaptcha_challenge_field'] = $this->params['form']['recaptcha_challenge_field'];
	$this->data['Post']['recaptcha_response_field'] = $this->params['form']['recaptcha_response_field'];
	// ここまで追加
bake したものにこれだけ加えます。

最後に Model ですが、App/models/post.php の $validate に
'recaptcha_response_field' => array(
	'checkReCaptcha' => array(
		'rule' => array('checkReCaptcha', 'recaptcha_challenge_field'),
		'message' => 'あ、なんか間違ったみたいだねー。',
	),
),

を加え、ルールを定義する関数として
function checkReCaptcha($data, $target) {
	App::import('Vendor', 'recaptchalib');
	$privatekey = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
	$res = recaptcha_check_answer(
		$privatekey,
		$_SERVER["REMOTE_ADDR"], 
		$this->data[$this->name][$target],
		$data['recaptcha_response_field']);
	return $res->is_valid;
}

という風に書いていけば

recaptcha_input.png

recaptcha_error.png

こんな感じで他の入力値と同じようにチェックできるからいいかもね、という話でした。


まあしかし、ビジネスロジックもデータも扱ってない…いやフォーム値のチェックだからな。 /* 追記 */ プラグイン化しました。記事は今度。

tbsmcd/recaptcha_plugin - GitHub


ラベル:cakephp PHP reCAPTCHA
posted by tbsmcd at 23:20| Comment(1) | TrackBack(0) | 技術 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
回复:[分享われわれと一緒だった。

Posted by ミュウミュウバッグコピー at 2012年03月26日 10:59
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。