How to use Google reCaptcha v3 in LWC Component
- akshay saxena
- Oct 30, 2024
- 2 min read
There are four steps to integrate recaptcha v3 to a Lightning Web Component
Create html static resource with reCaptcha
reCAPTCHAv3.html
<html>
<head>
<title></title>reCAPTCHA html resource</title>
<script src="https://www.google.com/recaptcha/api.js?render=reCAPTCHA_site_key"></script>
</head>
<body>
<input type="hidden" name="recaptcha_response" id="recaptchaResponse"/>
<script type="text/javascript">
grecaptcha.ready(function() {
var reCAPTCHA_site_key = "reCAPTCHA_site_key";
grecaptcha.execute('reCAPTCHA_site_key', {action: 'submit'}).then(function(token) {
recaptchaResponse.value = token;
if (token == "") {
parent.postMessage({ action: "getCAPCAH", callCAPTCHAResponse : "NOK"}, "*");
} else {
parent.postMessage({ action: "getCAPCAH", callCAPTCHAResponse : token}, "*");
}
});
}
</script>
</body>
</html>
Create LWC to Load the Static Resource
reCaptchaLWC.html
<template>
<iframe src={navigateTo} name="captchaFrame" onload={captchaLoaded}></iframe>
</template>
reCaptchaLWC.Js
import { LightningElement, track, api } from 'lwc';
import pageUrl from '@salesforce/resourceUrl/reCAPTCHAv3';
import isReCAPTCHAValid from '@salesforce/apex/reCAPTCHAv3ServerController.isReCAPTCHAValid';
export default class GoogleCapatcha extends LightningElement {
@api formToken;
@api validReCAPTCHA = false;
@track navigateTo;
captchaWindow = null;
constructor(){
super();
this.navigateTo = pageUrl;
}
captchaLoaded(evt){
var e = evt;
console.log(e.target.getAttribute('src') + ' loaded');
if(e.target.getAttribute('src') == pageUrl){
window.addEventListener("message", function(e) {
if (e.data.action == "getCAPCAH" && e.data.callCAPTCHAResponse == "NOK"){
console.log("Token not obtained!")
} else if (e.data.action == "getCAPCAH" ) {
this.formToken = e.data.callCAPTCHAResponse;
isReCAPTCHAValid({tokenFromClient: formToken}).then(data => {
this.validReCAPTCHA = data;
});
}
}, false);
}
}
}
Create Apex Class to handle Server- Side validation
reCAPTCHAv3ServerController.cls
public with sharing class reCAPTCHAv3ServerController {
public reCAPTCHAv3ServerController(){
}
@AuraEnabled
public static Boolean isReCAPTCHAValid(String tokenFromClient) {
String SECRET_KEY = 'reCAPTCHA_secret_key';
String RECAPTCHA_SERVICE_URL = 'https://www.google.com/recaptcha/api/siteverify';
Http http = new Http();
HttpRequest request = new HttpRequest();
request.setEndpoint(RECAPTCHA_SERVICE_URL + '?secret=' + SECRET_KEY + '&response' + tokenFromClient);
request.setMethod('POST');
request.setHeader('Content-Length', '0');
HttpResponse response = http.send(request);
Map<String, Object> mapOfBody = (Map<String, Object>) JSON.deserializeUntyped(response.getBody());
Boolean success = (Boolean) mapOfBody.get('success');
return success;
}
}
Configure the Google reCAPTCHA and get the Site Key & Secret Key:
Login to Google reCAPTCHA
Register a new site
Add Label e.g. Salesforce.com
Select reCAPTCHA type “reCAPTCHA v3”
Add a domain e.g. yourorgurl.com
Accept the reCAPTCHA Terms of Service
Submit and get the Site Key & Secret Key
Comments