SalesforceでGoogle reCaptcha V3を実装してみました。
Google reCaptcha V3がリリースされて、AIがボットかどうかを判定してくれるそうです。
それによって、とってもめんどくさかった画像の選択とかがなくなったそうなので実装してみました。
例によってPHPのサンプルとかしかなかったのでここに記載しておきます。
ちなみに、Google側の仕組みは全く分かっていないので、説明が雑ですが悪しからず。
始めにGoogleアカウントを作成してキーを取得してください。
まずはページ側からJavascriptでGoogleからトークンを取得します。
-
<apex:page controller="reCaptcha_Ctrl" >
-
<script src="https://www.google.com/recaptcha/api.js?render=サイトキー"></script>
-
<script>
-
grecaptcha.ready(function() {
-
var form = document.getElementsByTagName('form')[0];
-
grecaptcha.execute('reCAPTCHAのキー',
-
action:'/apex/このVisualforcePage名'}).then(function(token) {
-
var recaptchaResponse = document.getElementById('recaptchaResponse');
-
recaptchaResponse.value = token;
-
});
-
});
-
</script>
-
<apex:form>
-
<apex:inputText value="{!hogehoge}"/>
-
<apex:commandButton action="{!save}" value="保存" id="Button"/>
-
</apex:form>
-
</apex:page>
フォーム送信時にクラス側から、GoogleにAPIを送信して結果を取得します。
-
public class reCaptcha_Ctrl{
-
// URL
-
private static String baseUrl = 'https://www.google.com/recaptcha/api/siteverify';
-
// シークレットキー
-
private static String secret = 'シークレットキー';
-
// tokenを取得
-
public String response { get { return ApexPages.currentPage().getParameters().get('recaptchaResponse');} }
-
//コンストラクタ
-
public reCaptcha_Ctrl(){
-
}
-
//処理
-
public PageReference save(){
-
// レスポンス
-
String responseBody = makeRequest(baseUrl,'secret=' + secret +'&response='+ response);
-
// レスポンスのsuccessの値を取得
-
String success = getValueFromJson(responseBody, 'success');
-
// レスポンスのスコア数を取得
-
Double inscore = double.valueOf(getValueFromJson(responseBody, 'score'));
-
// successがTrueの場合 かつ スコア数が0.5以上の場合
-
if(success.equalsIgnoreCase('true') && inscore >= 0.5){
-
// 成功の処理
-
}else{
-
// ボット対策の処理
-
}
-
return null;
-
}
-
//API投げるメソッド
-
private static String makeRequest(string url, string body) {
-
HttpResponse response = null;
-
HttpRequest req = new HttpRequest();
-
Http http = new Http();
-
req.setEndpoint(url);
-
req.setMethod('POST');
-
req.setBody (body);
-
response = http.send(req);
-
return response.getBody();
-
}
-
// Jsonの中身を返すメソッド
-
public static string getValueFromJson ( String strJson, String field ) {
-
JSONParser parser = JSON.createParser(strJson);
-
while (parser.nextToken() != null) {
-
// トークン全体を比較
-
if ((parser.getCurrentToken() == JSONToken.FIELD_NAME)) {
-
// FIELD NAME を返す
-
if(parser.getText() == field){
-
// FIELD NAMEに対して値を返す
-
parser.nextToken();
-
// 次のトークンを返す
-
return parser.getText();
-
}
-
}
-
}
-
return parser.getText();
-
}
-
}
ボットだとsuccessがfalseで帰ってきます。
手動だとscoreが返ってきますが、同じ動きを連続で実施すると点数がどんどん下がります。
Googleが何しているのかは謎。
その他のSalesforce記事
VisualforceでcommandButtonにrerender属性を設定して、 oncompleteにコールバック処理を記載したら動作してくれない。