Ensure that the Native API is enabled to integrate Clerk in your native application. In the Clerk Dashboard, navigate to the Native Applications page.
When creating your Clerk application in the Clerk Dashboard, your authentication options will depend on how you configure your Chrome Extension. Chrome Extensions can be used as a popup, a side panel, or in conjunction with a web app. Popups and side panels have limited authentication options. Learn more about what options are available.Google Chrome Icon
Plasmo is a browser extension framework that includes hot reloading and creating development and production extension builds easily from the same code.
Plasmo strongly recommends using pnpm, so this guide will only use pnpm-based examples.
The following command creates an app with Tailwind CSS preconfigured and with a src/ directory. You can choose to remove one or both of those options.
Plasmo offers several options for environment variable files, as the same codebase can be used for development and production builds, as well as for targeting different browsers. This guide uses .env.development and .env.chrome files.
Add the following keys to your .env.development file. These keys can always be retrieved from the API keys page in the Clerk Dashboard.
In the Clerk Dashboard, navigate to the API keys page.
In the Quick Copy section, select Chrome Extension and copy your Clerk Publishable Key and Frontend API URL.
The <ClerkProvider> component provides session and user context to Clerk's hooks and components. It's recommended to wrap your entire app at the entry point with <ClerkProvider> to make authentication globally accessible. See the reference docs for other configuration options.
You can control what content signed in and signed out users can see with Clerk's prebuilt components. Create a header with the following Clerk components. (With Chrome Extensions, you can also add this logic to a footer).
<SignedIn>: Children of this component can only be seen while signed in.
<SignedOut>: Children of this component can only be seen while signed out.
<UserButton />: A prebuilt component that comes styled out-of-the-box to show the avatar from the account the user is signed in with.
To avoid navigation errors, set the afterSignOutUrl, signInFallbackRedirectUrl and signUpFallbackRedirectUrl props for <ClerkProvider>. Chrome Extensions don't use an http URL, such as http://localhost:3000. Instead, they use a chrome-extension:// URL appended with an unique extension ID called a CRX ID. This URL is what you will pass to these props.
Chrome Extensions have a unique CRX ID that rotates by default, which can cause errors with the Clerk integration. To avoid these problems, ensure that you have a consistent CRX ID in both development and production for your extension by following these steps:
Set the key value to "$CRX_PUBLIC_KEY". This helps configure the consistent CRX ID for your extension.
Set the permissions array to include "cookies" and "storage". permissions specifies which permissions your extension requires.
Set or update the host_permissions array to include "http://localhost/*" and "$CLERK_FRONTEND_API/*". host_permissions specifies which hosts, or websites, have permission to sync auth state with your app.
package.json
{// The rest of your package.json file"manifest": {"key":"$CRX_PUBLIC_KEY","permissions": ["cookies","storage"],"host_permissions": ["http://localhost/*","$CLERK_FRONTEND_API/*"] }}
Plasmo facilitates Chrome Extension development by automatically "hot loading" the app whenever you save a changed file in the project. This ensures the build/chrome-mv3-dev folder remains up to date. Without the plugin, you would need to manually execute the build command and reload your Chrome Extension after each change. Plasmo automates this process, streamlining development.
Run the following command to start your development environment. This also creates the build in build/chrome-mv3-dev, and rebuilds when you make changes to the extension.
To load your Chrome Extension, follow these steps:
Open Chrome or a Chromium-based browser and navigate to chrome://extensions.
In the top-right, enable Developer mode.
In the top-left, select Load unpacked.
Navigate to where your project is located and select the build/chrome-mv3-dev folder. Then select Select. Your extension will now be loaded and shown in the list of extensions.
In your Chrome browser, open the extension popup. Ensure that the <SignInButton> appears, and that selecting it opens the <SignIn /> modal. Sign in and ensure that the <UserButton /> appears in the header.
Warning
After signing up or signing in, your popup may appear to crash. Closing and reopening the popup should restart the extension and you should be signed in.
For Chrome Extension's configured as popups, learn how to use Clerk's createClerkClient() function in a background service worker to ensure that the user's session is always fresh.