Use this file to discover all available pages before exploring further.
This guide shows you how to implement Privy authentication and wallets in your Chrome extension using Privy’s React SDK. Chrome extensions offer a unique application experience for your users, but come with some unique nuances specifically around social login.
Cross-origin fetch() restrictions:
Extensions can only use fetch() and XMLHttpRequest() to access domains specified in host_permissions. If the extension were compromised, it would still only have permission to interact with websites that meet the match pattern. The attacker would only have limited ability to access sites not in this list.
Always validate and sanitize inputs, especially from content scripts:
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { // Validate sender is from your extension if (sender.id !== chrome.runtime.id) return; // Validate and sanitize request data if (request.action === 'updateUser' && typeof request.userData === 'object') { // Process validated data updateUser(request.userData); }});
Content scripts can be compromised by malicious websites, so treat all messages from content
scripts as potentially malicious.
You’ll get your extension ID after loading the extension in Chrome’s developer mode at
chrome://extensions/.
In the Privy dashboard, configure OAuth settings for your extension:1. Add allowed originsGo to App Settings > Domains and add:
chrome-extension://<your-extension-id>
2. (Optional) Configure redirect URLs
Use chrome.identity.getRedirectURL() to get the exact redirect URL programmatically.
If your extension uses social login, you’ll need to configure redirect URLs.In your allowed domains, add the following redirect URL, and additionally in your allowed redirect URLs
Chrome extensions can’t handle social OAuth flows directly in the popup due to security restrictions. Social login requires opening either the options page or a popup window. This provides the full browser context needed for OAuth redirects.Both approaches follow the same flow:
User clicks “Sign in with social” in extension
Open authentication context (options page or popup window)
Privy handles the OAuth flow
User is redirected back to the extension authenticated
Avoiding Chrome Web Store rejection for remote code
The Chrome Web Store prohibits extensions from loading remotely hosted code. By default, @privy-io/react-auth bundles dependencies that inject remote scripts at runtime, which can cause your extension to be rejected during review — even if those scripts never execute.
Disabling these features prevents the scripts from loading at runtime, but the Chrome Web Store review scans your extension package statically. The CAPTCHA wrapper code may still appear in your bundled output as a separate chunk, even if it is never executed.To remove it from the bundle entirely, alias the underlying CAPTCHA dependencies to empty stubs in your bundler config:
This replaces the CAPTCHA libraries with inert stubs during bundling, so the remote Cloudflare and hCaptcha URLs do not appear anywhere in the extension package.
These aliases depend on the internal dependency structure of @privy-io/react-auth and may need
to be updated when upgrading SDK versions. Verify your built extension does not contain references
to challenges.cloudflare.com or js.hcaptcha.com after each upgrade.
Minimize web-accessible resources to reduce attack surface
Implement strict CSP with frame-ancestors 'none'
Validate all inputs from content scripts and external sources
Update OAuth configuration with production URLs in Privy dashboard
Review externally connectable settings for trusted domains only
Chrome extensions with OAuth require Google’s review. Document your authentication flow and
privacy practices clearly in your Web Store listing. Follow the Chrome Web Store security best
practices for
faster approval.