Resources
Chrome Extension Starter
Complete starter repository with Privy authentication and wallet management.
Set up your Chrome extension project
First, create a React app and install Privy:manifest.json
file in the public
directory:
The
identity
permission is required for OAuth flows, and storage
is recommended for persisting
user sessions.Security Guidelines
Below are comprehensive security guidelines for Chrome extensions. You can find more information in the Chrome extension security documentation.Security best practices
Security best practices
Content Security Policy
Add a strict CSP to your manifest to prevent code injection and framing attacks. You can see our broader CSP guidance here.The
frame-ancestors 'none'
directive prevents your extension from being embedded in frames,
protecting against clickjacking attacks.Minimal permissions
Only request permissions your extension actually needs. Limiting permissions reduces attack surface if compromised: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.Remove unused permissions like
tabs
, activeTab
, or broad host permissions to reduce your
extension’s attack surface and improve user trust.Externally connectable
Restrict which external extensions and web pages can communicate with your extension:Only include trusted sources in
externally_connectable
. This prevents malicious sites from
communicating with your extension.Web-accessible resources
Minimize web-accessible resources as they make your extension detectable and create attack vectors:Keep web-accessible resources to a minimum. Each exposed resource increases potential attack
surface.
Secure DOM manipulation
Avoiddocument.write()
and innerHTML
which can lead to script injection:Validate all inputs
Always validate and sanitize inputs, especially from content scripts:Content scripts can be compromised by malicious websites, so treat all messages from content
scripts as potentially malicious.
Configure your Privy dashboard
You’ll get your extension ID after loading the extension in Chrome’s developer mode at
chrome://extensions/
.Use
chrome.identity.getRedirectURL()
to get the exact redirect URL programmatically.Enabling social login in your extension
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
1
2
Open authentication context (options page or popup window)
Both approaches use the same authentication logic:
You can use the same
AuthComponent
for both approaches - just render it in different HTML files
(options.html or auth.html).3
Redirect back to the extension
Redirect the user back to the extension after authentication.
That’s it! 🎉
You’ve now implemented Privy authentication in your Chrome extension.Production considerations
Before publishing to the Chrome Web Store:- Remove unnecessary permissions from manifest
- Limit host permissions to only required domains
- 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.