Enhancing React Native App Security with Google reCAPTCHA v3
Tags: reactnative, android, ios, captcha
Published: 2024-05-04 14:43:24

## Introduction:

In today's digital age, ensuring the security and integrity of online platforms is paramount. One widely used method to combat spam and abuse is Google reCAPTCHA. In this post, we'll explore how to integrate Google reCAPTCHA v3 into a React Native app using the `@haskkor/react-native-recaptchav3` library.

> First, let's take a quick look at what Google reCAPTCHA v3 is and why it's valuable.

---

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4abudw9tbaju8qwc7zcr.png)

---

## Google reCAPTCHA v3:

Google reCAPTCHA is a free service offered by Google that helps protect websites and apps from spam and abuse. Unlike its predecessors, reCAPTCHA v3 runs in the background without requiring user interaction, making the user experience seamless while still providing robust protection.

## Key features of reCAPTCHA v3 include:

**1). Invisible Protection:** Users don't need to solve puzzles or click checkboxes, improving usability.
**2). Risk Analysis:** reCAPTCHA v3 assigns a score to each user action, allowing you to take appropriate measures based on the risk level.
**3). Easy Integration:** Google provides libraries and APIs for various platforms, simplifying the implementation process.


## Visual Guide: 
Implementing Google reCAPTCHA v3 in React Native


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vnxg99msfmpkbbtvzlg6.gif)

---

## Getting Started:

**Register with Google reCAPTCHA:**

Visit [Google reCAPTCHA Admin Console](https://www.google.com/recaptcha/admin/create) to register a new site.
- Choose reCAPTCHA v3 as the type and whitelist the domain name without 'https://', for example, 'your-domain.com'.
- After registration, you'll receive a Site Key and a Secret Key.


**Package.json Dependencies**
Below are the dependencies specified in the `package.json` file for a React Native project:

```
{
    "dependencies": {
    "@haskkor/react-native-recaptchav3": "^1.2.1",
    "react": "18.2.0",
    "react-native": "0.72.3",
    "react-native-webview": "^11.18.1"
  },
}
```


Now, let's dive into the implementation using React Native and `@haskkor/react-native-recaptchav3`.

## Implementation Steps:

**1. Install Dependencies:**
Start by installing the @haskkor/react-native-recaptchav3 library using npm or yarn:

```
npm install @haskkor/react-native-recaptchav3
# or
yarn add @haskkor/react-native-recaptchav3

```
**2. Import Required Modules:**
In your React Native component file, import the necessary modules and utilities:

```
import React, { useRef, useState } from 'react';
import { View, StyleSheet, TouchableOpacity, Text } from 'react-native';
import ReCaptchaV3 from '@haskkor/react-native-recaptchav3';

```
**3. Implement the Captcha Component:**
Define your Captcha component, which will handle the reCAPTCHA functionality:

```
const CaptchaV3Lib1 = () => {
  const [show, setShow] = useState(false);
  const [captchaToken, setCaptchaToken] = useState('');
  const captchaRef = useRef(null);

  const handleTokenReceive = (token) => {
    setCaptchaToken(token);
    captchaRef.current = token;
    setShow(false);
  };

  const handleRefreshToken = () => {
    setShow(true);
    if (captchaRef.current) {
      captchaRef.current.refreshToken();
    }
  };
  return (
    <View style={styles.container}>
      {show ? (
        <ReCaptchaV3
          ref={captchaRef}
          captchaDomain={'https//yourDomain.com'} // same domain which you mention on google captcha console
          siteKey={Your Site Key}
          onReceiveToken={handleTokenReceive}
        />
      ) : null}

      <TouchableOpacity
        style={styles.buttonContainer}
        onPress={handleRefreshToken}>
        <Text style={styles.txt}>Open Captcha V3</Text>
      </TouchableOpacity>
    </View>
  );
};

```


## Token Verification
**Implementing Secure Authentication:** The snippet below illustrates backend code used to authenticate tokens sent from a React Native application in JS

```
export const validateCaptchaToken = async (token = '', callback = {}) => {
  const params = {
    secret: YOUR_SECRET_KEY,
    response: YOUR_TOKEN,
  };

  try {
    const postData = new URLSearchParams(params).toString();
    const options = {
      method: 'POST',
      headers: {
        'Content-Type': 'application/x-www-form-urlencoded',
      },
    };

    const response = await fetch(SITE_VERIFY_URL, {
      ...options,
      body: postData,
    });

    if (response?.ok && response?.status === 200) {
      // do you code here
    } else {
      // handle the failure case here
    }
  } catch (error) {
    // handle the failure case here
  }
};
```


## Conclusion:

Implementing Google reCAPTCHA v3 in React Native using `@haskkor/react-native-recaptchav3` is a straightforward process that enhances your app's security without compromising user experience. By integrating reCAPTCHA v3, you can effectively mitigate spam and abuse while providing a seamless interaction for your users.

Feel free to modify the code and styles according to your project requirements. Happy coding!

## References:

- **Google reCAPTCHA:** [Google reCAPTCHA developer resources](https://www.google.com/recaptcha/admin/create)
- **@haskkor/react-native-recaptchav3:** [library repository](https://www.npmjs.com/package/@haskkor/react-native-recaptchav3)
- Download the source code for this post from my [github](https://github.com/amitmehtacode/captcha)

Feel free to customize the content further or add additional details as needed!