This is a React component that can be used to protect your React and NextJS applications with Cloudflare Access.
npm install --save turnstile-next
or
yarn add turnstile-next
In your layout or page, import the TurnstileNextContext
and use it your page or layout like so:
import TurnstileContext from 'turnstile-next/vercel';
export default function Layout({ children }) {
return (
<>
<div>{children}</div>
<TurnstileContext />
</>
);
}
only cloudflare script tag is included here.
In your index.html
file, use the cloudflare script tag like so:
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" defer async></script>
and you can use the TurnstileInput
component like so:
import TurnstileInput from 'turnstile-next';
const SITE_KEY = import.meta.env.VITE_SITE_KEY;
export default function MyComponent() {
const onVerify = (token : string) => {
console.log(token);
}
const onErr = (err : string) => {
console.log(err);
}
return (
<div>
<TurnstileInput onVerify={onVerify} onErr={onErr} siteKey={SITE_KEY} />
</div>
);
}
import TurnstileInput from 'turnstile-next';
const SITE_KEY = process.env.NEXT_PUBLIC_SITE_KEY;
export default function MyComponent() {
const onVerify = (token : string) => {
console.log(token);
}
const onErr = (err : string) => {
console.log(err);
}
return (
<>
<TurnstileInput onVerify={onVerify} onErr={onErr} siteKey={SITE_KEY} />
</>
);
}
The TurnstileInput
component accepts a set of properties that are used to configure the Turnstile challenge. Here's a detailed description of each property:
Property | Description |
---|---|
siteKey (required) | The site key for your Turnstile challenge. This key is obtained from the Turnstile dashboard. |
theme | The theme of the challenge. Defaults to "auto". |
locale | The locale of the challenge. Defaults to "en". |
size | The size of the challenge. Defaults to "normal". |
fieldName | The name of the field that will be used to store the token. Defaults to "cf-turnstile-token". |
retryInterval | The interval in milliseconds to retry the challenge. Defaults to 8000. |
retry | Whether to retry the challenge. Defaults to true. |
refreshOnExpired | Whether to refresh the challenge when it expires. Defaults to "auto". |
onVerify | A callback that will be called when the challenge is verified. |
onError | A callback that will be called when the challenge fails. |
onExpire | A callback that will be called when the challenge expires. |
onBeforeInteractive | A callback that will be called when the challenge is about to be interactive. |
onAfterInteractive | A callback that will be called when the challenge is interactive. |
onUnsupported | A callback that will be called when the challenge is unsupported by the user's browser. |
For detailed information on each property and its usage, please refer to the Turnstile documentation.
This function can be used to refresh the Turnstile challenge. It accepts a single parameter, options
, which is an object that can be used to configure the refresh. Here's a detailed description of each property:
Property | Description |
---|---|
className | The class name of the Turnstile challenge. Defaults to "cf-turnstile". |
example:
import { refreshTurnstile } from 'turnstile-next/utils';
const refresh = () => {
refreshTurnstile({ className: 'cf-turnstile' });
};
export default function MyComponent() {
return (
<>
<button onClick={refresh}>Refresh</button>
</>
);
}
This function can be used to check if the Turnstile challenge has been rendered.
example:
import { useEffect } from 'react';
import { checkWidgetRender } from 'turnstile-next/utils';
export default function MyComponent() {
useEffect(() => {
checkWidgetRender();
}, []);
return (
<>
<div>My Component</div>
</>
);
}
Contributions are always welcome!