認証の仕組み
キャプチャを設置するだけでは意味がありません。「ユーザーがキャプチャによる認証をパスした」ことを、プログラム側に伝えるシステムが必要です。それを実装するためには、仕組みを理解しておきましょう。ユーザーが、キャプチャによる認証をパスすると、下記のようなコードが生成されます。このコードは約2分間のみ有効なものです。
03AHJ_Vuu6KcsH4jclU1-wE4S16thsKXkZO8R7AnEuLlRBYU7TtrNS770vZuGifKdRsILiU-NHXJKuS6pGRZaxqHjDocUstdf8V81EA-jyKHvKloj1wX7ubbB2EsDkGPSJLzDwnp7k9jOzVF_WTPlHVc_JkOnMHJNTeS7TLxPATFHweIatg8VbSvXqLUm4JKF-hb4N1uB5x2WRR9baCkC84jdaSCxUfMhogv6e ... 0cZBbwtUitSQBuQarzcLx0poA6Oq9DXlgc4AQSo0GUVTkup4QQ
その後、ユーザーがフォームのボタンをクリックして、コメントなりメールなりの送信を実行した時、プログラム側に送られる従来のパラメータに、g-recaptcha-response
というパラメータが追加され、その値が上記のコードになります。
フォームから送信されるデータ
例えば、通常のform
要素から送信した場合、例えば、送信される内容は下記の通りです。
これが、キャプチャが実装されていて、さらにユーザーがreCaptchaの認証を経た場合は、パラメータが追加されます。
name=あらゆ&text=こんにちは&g-recaptcha-response=03AHJ_Vuu6KcsH4jclU1-wE4S16thsKXkZO8R7AnEuLlRBYU7TtrNS ...
ユーザーが認証を経ずに送信ボタンを押した場合は、値が空になります。
name=あらゆ&text=こんにちは&g-recaptcha-response=
コードの受け取り
開発者は、プログラム側において、g-recaptcha-response
にある値を受け取り、次の処理に進むことになります。g-recaptcha-response
が空の場合は、ユーザーが認証をしていないことになります。例えばPHPを用いて、フォームからデータを受け取る時は、下記のようになります。ブラウザに出力する意味はありませんが、例えばの場合です。
GETメソッドの場合
$_GET["g-recaptcha-response"]
POSTメソッドの場合
$_POST["g-recaptcha-response"]
コードが正しいものか判定
さて、このコードを受け取ったところで、まだ何の認証にもなってないことは分かると思います。例えば、適当にg-recaptcha-response
というパラメータに値を設定してリクエストが送られる可能性があります。この値が本当に、ユーザーがreCAPTCHAによるキャプチャ認証を通して発行したものかどうかを確認する必要がありますね。そのためには、APIを利用します。下記のURLにリクエストを送って、返り値を解析して下さい。ここで、「Secret key」が登場しますね。
GET https://www.google.com/recaptcha/api/siteverify?secret={Secret key}&response={認証コード}
リクエストが正常に行なわれた時、JSONデータを取得することができます。まず、認証コードが正当なものだと判定された場合のサンプルです。success
プロパティがBoolean値のtrue
ならキャプチャ認証は正当です。
続いては、ユーザーが認証コードg-recaptcha-response
に適当な値を設定してリクエストしてきたなどして、認証コードが不正だった場合です。success
プロパティはBoolean値のfalse
、そしてerror-codes
プロパティに、不正と判定された原因を示すコードが配列形式で格納されています。単純に判定結果のJSONを出力します。
JSON
{"success": false,"error-codes": ["invalid-input-response"]}
サンプルプログラム
reCAPTCHAを実装したフォームから送られてきたデータを処理する前に、認証コードが正しいか不正かを判定するサンプルプログラムは下記の通りです。
PHP
<?php
// エラー判定
if( !isset( $_GET['g-recaptcha-response'] ) )
{
$_GET['g-recaptcha-response'] = '' ;
}
// シークレットキー
$secret_key = '' ;
// エンドポイント
$endpoint = 'https://www.google.com/recaptcha/api/siteverify?secret=' . $secret_key . '&response=' . $_GET['g-recaptcha-response'] ;
// 判定結果の取得
$curl = curl_init() ;
curl_setopt( $curl , CURLOPT_URL , $endpoint ) ;
curl_setopt( $curl , CURLOPT_SSL_VERIFYPEER , false ) ; // 証明書の検証を行わない
curl_setopt( $curl , CURLOPT_RETURNTRANSFER , true ) ; // curl_execの結果を文字列で返す
curl_setopt( $curl , CURLOPT_TIMEOUT , 5 ) ; // タイムアウトの秒数
$json = curl_exec( $curl ) ;
curl_close( $curl ) ;
// JSONの出力を明示
header( 'Content-Type: application/json; charset=utf-8' ) ;
// 結果の出力
echo $json ;
サンプルデモを見る