React: ReCAPTCHA v3 Client and Server Demo

React: ReCAPTCHA v3 Client and Server Demo

In this demo, I’ll use Google ReCAPTCHA v3 credentials within a React application built on Next.js. The ReCAPTCHA token will be generated on the client side and validated on the server side.

Links

Step 1: Generate Your ReCAPTCHA Credentials

Go to Google ReCaptcha V3 and generate your credentials.


Generate Your ReCAPTCHA Credentials

Step 2: Import the ReCaptcha library

<Script src={`https://www.google.com/recaptcha/enterprise.js?render=${process.env.NEXT_PUBLIC_RE_CAPTCHA_SITE_KEY}`} />        
Note: There are some packages you could use, but the implementation is simple.

Step 3: Call the execute method in your click handler

const loginClickHandler = (event) => {
  event.preventDefault();

  grecaptcha.enterprise.ready(async () => {
    const token = await grecaptcha.enterprise.execute(
      process.env.NEXT_PUBLIC_RE_CAPTCHA_SITE_KEY,
      { action: "LOGIN" }
    );

    await submit(token);
  });
};        

grecaptcha is an object injected by the imported script.

Note: When using Next.js, ensure all environment variables exposed in the browser are prefixed with NEXT_PUBLIC.

When the user clicks login, the app automatically generates a captcha for them by calling two methods from the grecaptcha object:

  • window.grecaptcha.enterprise.ready: This makes sure the Google reCAPTCHA object is ready to go.
  • window.grecaptcha.enterprise.execute: This generates the captcha token.

Finally, the data is sent to the backend (in my case, I’m using a Lambda function), along with the generated captcha token.

const submit = async (code) => {
  await fetch("`/.netlify/functions/react-recaptcha-v3-nextjs", {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
    },
    body: JSON.stringify({ code }),
  });
};        
Note: If you are working with a form, you’d also include other field values like username, name, or any additional data your form collects.

Step 4: Validate the Captcha on the Backend

const validateReCaptcha = async (captcha) => {
  const url = `https://www.google.com/recaptcha/api/siteverify?secret=${process.env.RE_CAPTCHA_SECRET_KEY}&response=${captcha}`;
  const response = await fetch(url, {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
    },
    body: JSON.stringify({ captcha }),
  });

  return response.json();
};        

validateReCaptcha is a backend method that calls a Google API endpoint, passing the SECRET_KEY (stored as an environment variable) and the Captcha token generated on the client.

If the Captcha is valid, the API response will look something like this:

{
  "success": true,
  "challenge_ts": "2024-11-24T03:04:34Z",
  "hostname": "localhost",
  "score": 0.9
}        

Conclusion

ReCaptcha is crucial for securing forms, especially when you're looking to prevent bots from submitting them. Google offers a free tier that provides up to 10,000 assessments per month (at the time of writing), making it a solid choice for many applications. The integration is made easier with the library that google provides. You'll just need to pass your credentials: SITE_KEY on the client side and SECRET_KEY on the server side.

A key point to remember is that the SECRET_KEY should never be exposed on the client side, as this could compromise the security of your application. Only the SITE_KEY is meant for the client.


要查看或添加评论,请登录

Jaime Garcia Diaz的更多文章

  • How to Set Up a Node.js Web Server on Raspberry Pi

    How to Set Up a Node.js Web Server on Raspberry Pi

    A couple of years ago, I bought a Raspberry Pi Model B+, and I finally decided to set up a web server on it. Raspberry…

  • React 19: New API use(promise)

    React 19: New API use(promise)

    In this post, I’ll demo how to read a value from a promise using use. Links Demo Codebase Snippet Let’s check out the…

    1 条评论
  • Web Development: Three Predictions for 2025

    Web Development: Three Predictions for 2025

    In my last post, I shared three things I learned during 2024. In this post, I’ll try to predict three things for 2025.

  • Programming: Three Lessons Learned in 2024

    Programming: Three Lessons Learned in 2024

    Three lessons I’ve learned this year: 1. AI: Use it or see ya later It’s no surprise that is everywhere, but this year…

  • React 19: Server Functions

    React 19: Server Functions

    Server Functions are functions referenced on the client but executed on the server. Here’s an example: Check my earlier…

  • React 19: New hook useActionState

    React 19: New hook useActionState

    Usually, when working with a form, you’d want to: a) Display a loader b) Show validation errors This often means…

  • Javascript: Implementing Passwordless Login with Salesforce

    Javascript: Implementing Passwordless Login with Salesforce

    Salesforce offers a Headless Passwordless Login Flow that allows registered users to access an application seamlessly…

  • React: Implementing Passwordless Login with AWS Cognito

    React: Implementing Passwordless Login with AWS Cognito

    Passwords are easy to forget, and users often reuse the same password for everything. On the other hand, almost…

  • React: LinkedIn Access Token in 10 Steps

    React: LinkedIn Access Token in 10 Steps

    I recently integrated with the LinkedIn API, and it turned out to be pretty straightforward. The task was to retrieve…

  • React + AWS Cognito: Email Authentication Setup Guide (Second Part)

    React + AWS Cognito: Email Authentication Setup Guide (Second Part)

    In the last post, we handled everything on the AWS side; now let's dive into React to set up our code. AWS provides the…