akishin999の日記

調べた事などを書いて行きます。

Rails アプリケーションで captcha を使う

Rails アプリで captcha を使いたかったので、github で公開されている captcha というプラグインを使ってみました。


zendesk's captcha at master - GitHub
http://github.com/zendesk/captcha

インストール

インストールするには事前に Git と RMagick のインストールが必要です。
開発用に使っている PC が Windows Vista なので、RMagick は前回(http://d.hatena.ne.jp/akishin999/20100203/1265217508)の通りにインストールを行いました。

Git は msysgit を使っています。

msysgit - Google Code
http://code.google.com/p/msysgit/


Git、RMagick が無事インストールされたら、コマンドプロンプトからプラグインをインストールする Rails アプリの直下まで移動して script/plugin install します。

>ruby script/plugin install git://github.com/zendesk/captcha.git

使用準備

まず、environment.rb に captcha 用のソルトを設定します。
以下のように何か適当な文字列を設定してください。
(適当なランダム文字列が思い浮かばない場合、Applet なので重いですが、よければこのあたりで生成して下さい)。

# captcha 用のソルト
CAPTCHA_SALT = '1Xxa5tlOTUNEvGMkuDJmnpd6chis2Be'


environment.rb にソルトを設定したら captcha 画像を生成を行います。
コマンドプロンプトから Rails アプリ直下に移動し、以下のように rake captcha:generate を実行して下さい。

>rake captcha:generate COUNT=50
(in C:/rails_apps/captcha_example)
Generating 50 captcha images off-line
Writing image file 9a0e515fa043b52a9044fe6c33766be8df7149e5.png
Writing image file 0f8a182a4b55fd501c4f3bc94fbe2895ba4c96f9.png
Writing image file 76b26e04f29666246cd82b39a6ea488fdb3b10d8.png
Writing image file 478f122febfa9ffcb55e2650b7d4b544e5067e69.png
Writing image file 04508bd81e0edf8dc3afad04f89926d7a80a3802.png
・
・
・


生成された captcha 画像は「public/system/captcha」以下に保存されます。
rake captcha:generate で指定可能なオプションは以下の通りです。

オプション 内容 デフォルト
COUNT 生成する画像の枚数 3
IMAGE_HEIGHT キャプチャ画像の高さ(ピクセル) 50
IMAGE_WIDTH キャプチャ画像の幅(ピクセル) 260
CAPTCHA_LENGTH キャプチャ画像の中に描画する文字数 5
FILE_FORMAT 生成される画像ファイルのフォーマット(PNGまたはGIF) png

使ってみる

まず View では、captcha_input_text、captcha_image、captcha_hidden_text の三つを以下のように form_tag の中に記述します。

<h1>Example#index</h1>
<p style="color: green"><%= flash[:notice] %>
<% form_tag( {:controller => :example, :action => :create} ) do -%>
  <%= captcha_input_text('下の画像の中に表示されている文字を入力してください:') %><br />
  <%= captcha_image %>
  <%= captcha_hidden_text %>
  <br />
  <%= submit_tag '送信' %>
<% end -%>


公式にあるように

<%= captcha_block %>

の一行でも良いのですが、View のレイアウトを細かく弄れるように上記の使い方を選択しました。

次に Controller です。

class ExampleController < ApplicationController
  validates_captcha

  def create
    if captcha_validated?
      flash[:notice] = 'captcha is valid.'
    else
      flash[:notice] = 'captcha is invalid.'
    end
    render :action => :index
  end
  
  def index
  end
end


まず Controller の先頭で「validates_captcha」と記述します。
あとは View からの Submit 先となる action 内で captcha_validated? メソッドを使う事で captcha 画像内の文字列が正しく入力されたかを検証できます。


たったこれだけのコードで captcha が実装できるのはお手軽でいい感じですね。
ちなみに、上記サンプルを作成した Rails のバージョンは 2.3.5 になります。