GithubHelp home page GithubHelp logo

codeep / react-recaptcha-google Goto Github PK

View Code? Open in Web Editor NEW
27.0 2.0 20.0 1.65 MB

This library helps to integrate google recaptcha into your react project easily.

Home Page: https://developers.google.com/recaptcha/intro

JavaScript 83.07% HTML 13.26% CSS 3.67%
recaptcha react-recaptcha react grecaptcha

react-recaptcha-google's Introduction

react-recaptcha-google

This component is created in order to make the experience of integrating Google ReCaptcha into React apps easier and smoother.

Currently, we are using ReCaptcha V2 here. ReCaptcha V3 is still in beta version; so, we will update our component when they release the stable version.

P.S. It will open the ReCaptcha window only when there are some doubts by Google; otherwise, it will automatically generate the recaptcha token.

Installation

npm install react-recaptcha-google --save

Usage

There are two components that you need to use.

1. Use loadReCaptcha() to initialize the ReCaptcha

This function should be imported and called in the main (parent) component of your app. We recommend calling it in componentDidMount() of App.js.

import { loadReCaptcha } from 'react-recaptcha-google'

...

componentDidMount() {
  loadReCaptcha();
}

2. Use ReCaptcha to integrate ReCaptcha in a particular component

invisible Recaptcha

Create a new component with the following code and give it a try!

import React, { Component } from 'react';
import { ReCaptcha } from 'react-recaptcha-google'

class ExampleComponent extends Component {
  constructor(props, context) {
    super(props, context);
    this.onLoadRecaptcha = this.onLoadRecaptcha.bind(this);
    this.verifyCallback = this.verifyCallback.bind(this);
  }

  componentDidMount() {
    if (this.captchaDemo) {
        console.log("started, just a second...")
        this.captchaDemo.reset();
        this.captchaDemo.execute();
    }
  }

  onLoadRecaptcha() {
      if (this.captchaDemo) {
          this.captchaDemo.reset();
          this.captchaDemo.execute();
      }
  }

  verifyCallback(recaptchaToken) {
    // Here you will get the final recaptchaToken!!!  
    console.log(recaptchaToken, "<= your recaptcha token")
  }

  render() {
    return (
      <div>
        {/* You can replace captchaDemo ref with whatever works for your component */}
        <ReCaptcha
            ref={(el) => {this.captchaDemo = el;}}
            size="invisible"
            render="explicit"
            sitekey="your_site_key"
            onloadCallback={this.onLoadRecaptcha}
            verifyCallback={this.verifyCallback}
        />
        <code>
          1. Add <strong>your site key</strong> in the ReCaptcha component. <br/>
          2. Check <strong>console</strong> to see the token.
        </code>
      </div>
    );
  };
};

export default ExampleComponent;

Visible / Normal Recaptcha

For having a visible ReCaptcha, you should make two minor changes on the above-mentioned code.

  1. Replace the size prop value invisible (see the imported ReCaptcha component) with either normal or compact. Those will add a checkbox with 'I am not a robot' label.
  2. Remove this.[captchaRef].execute() lines from your code.
Optional props
  • data-theme - you can add theme prop with a value of either "dark" or "light"(default) to control the background theme of the visible ReCaptcha (when size is normal or compact)
  • data-badge - you can send badge prop with one of the following values: bottomright (default), bottomleft, inline. This will allowyou to reposition the ReCaptcha badge.

3. Save Google response into state or inside a hidden field

  verifyCallback(recaptchaToken) {
    const {
      change
    } = this.props;
    // inside hidden field
    change('recaptchaResponse', recaptchaToken);
    // or state
    this.setState('recaptchaResponse', recaptchaToken)
  }
  
  render() {
  ...
  return {
     <Field
       component={TextField}
       name="recaptchaResponse"
       type="hidden"
       disabled/>
       ...
       }

4. Implement code server side to validate the response

import * as request from 'request'; // from "web-request": "^1.0.7",

async check(recaptchaResponse: string, remoteAddress: string): Promise<boolean> {
 const secretKey = "";
    return new Promise<boolean>((resolve, reject) => {
      const verificationUrl = 'https://www.google.com/recaptcha/api/siteverify?secret=' + secretKey + '&response=' + recaptchaResponse + '&remoteip=' + remoteAddress;
      request(verificationUrl
        , function(error, response, body) {
          if (error) {
            return reject(false);
          }
          if (response.statusCode !== 200) {
            return reject(false);
          }

          body = JSON.parse(body);
          const passCaptcha = !(body.success !== undefined && !body.success);
          resolve(passCaptcha);
        });
    });
  }

react-recaptcha-google's People

Contributors

cedricwalter avatar jobeso avatar lifeiscontent avatar narek118 avatar vlad-grigoryan avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

react-recaptcha-google's Issues

V3 Support

I know you mention it will be supported "when it's stable", but since there are already a couple v2 react components out there already, you may be able to capture more of the market if you changed this to support v3 right now.

setState() called on an unmounted component

I get the following error message in the console when I implement and use the <ReCaptcha> component in my own component.

"Warning: setState(...): Can only update a mounted or mounting component. This usually means you called setState() on an unmounted component. This is a no-op. Please check the code for the ReCaptcha component."

Something not updated yet due to latest React and lib version?

Recaptcha Language

How do i change the language of the recaptcha? Using En language right now, but i need to change it do pt-BR. Already try to pass the props hl='pt-BR' and lang='pt-BR' but this didn't work.

yargs-parser vulnerability

I am experiencing an issue due to an old version of a very old version of Webpack, which depends on a yargs-parser.

Any changes to get it bumped up to newer version of Webpack?

yarn audit v1.22.1
┌───────────────┬──────────────────────────────────────────────────────────────┐
│ low           │ Prototype Pollution                                          │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Package       │ yargs-parser                                                 │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Patched in    │ >=13.1.2 <14.0.0 || >=15.0.1 <16.0.0 || >=18.1.2             │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Dependency of │ react-recaptcha-google                                       │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Path          │ react-recaptcha-google > webpack > yargs > yargs-parser      │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ More info     │ https://www.npmjs.com/advisories/1500                        │
└───────────────┴──────────────────────────────────────────────────────────────┘

no function called on timeout

If my reCaptcha is validated, and then later times-out -there doesn't seem to be a function to call on timeout to update my stored token so I can control my validation. Am I missing something? Otherwise this might be a bug.
There's an onError attribute in one of the example files, but when I try it nothing happens. Also, the rest of the attributes in that example don't match the readme either

After looking into the src I see there is also an onExpired prop I can use, and that function doesn't seem to launch my function either on-expiration.

grecaptcha.render is not a function error

I'm calling loadReCaptcha on my App.js component's componentDidMount
If I go to the page that I'm using the recaptcha at after starting my app, everything is working fine.

But if i go directly to that page with my react router an error occurs, I'm guessing loadReCaptcha didn't finish loading and grecaptcha was called before it loaded

Please let me know if you need any additional info

And one more question, do you guys have any plans on updating your documentation?

Here's how I'm rendering it:

<ReCaptcha
  ref={el => {
    this.captcha= el;
  }}
  size="normal"
  render="explicit"
  sitekey={"Key"}
  onloadCallback={this.onLoadRecaptcha}
  verifyCallback={this.verifyCallback}
  expiredCallback={this.clearRecaptchaToken}
/>

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.