This Quickstart is currently in Beta. We’d love to hear your feedback!
Prerequisites:
- Node.js 20 LTS or newer
- npm 10+ or yarn 1.22+ or pnpm 8+
- Optional: jq (for CLI automation) and openssl (to generate secure secrets)
- Hono projects should use Hono >= 3.x (peer dependency)
Get Started
This quickstart shows the minimal, recommended way to secure a Hono application using@auth0/auth0-hono. It follows the repository’s recommended patterns: environment-driven configuration, app.use(auth(...)) middleware, and requiresAuth() for selective protection.
1
Create a new project
Create a new folder and initialize a Node project.
2
Install dependencies
Install Hono and the Auth0 middleware. Optionally install
tsx for running TypeScript directly during development.3
Create an Auth0 application
Create an Auth0 Application in your Auth0 tenant (Regular Web Application) and record the Domain, Client ID, and Client Secret.
- CLI
- Dashboard
(macOS) Example automation using Auth0 CLI + Use the generated
jq:.env or update values manually as needed.4
Add configuration (.env)
Create a Note:
.env file at your project root with these values:AUTH0_SESSION_ENCRYPTION_KEY must be at least 32 characters. Use openssl rand -hex 32 to generate one.5
Add Hono server with Auth0 middleware
Create a Add a
server.ts file with the following example.package.json script to run with tsx for development:6
Run your app
Start the server and open
http://localhost:3000.CheckpointYour Hono app should be running on http://localhost:3000. The
/ route is public. Visiting /profile should redirect you to login (if not authenticated) and then return profile data after successful authentication.Troubleshooting
Common issues
Common issues
Callback or Redirect Mismatch
Callback or Redirect Mismatch
Cause: The callback URL configured in the Auth0 Dashboard does not exactly match
BASE_URL + the callback route (e.g., http://localhost:3000/auth/callback).Fix:- Verify
.envBASE_URLvalue. - Ensure Allowed Callback URLs in Auth0 Dashboard contain
http://localhost:3000/auth/callback. - Restart dev server after changes.
Session decryption / JWEDecryptionFailed
Session decryption / JWEDecryptionFailed
Cause:
AUTH0_SESSION_ENCRYPTION_KEY is missing or too short, or you changed it while cookies from an old secret remain.Fix:- Ensure
AUTH0_SESSION_ENCRYPTION_KEYis at least 32 characters. - Clear browser cookies for localhost after changing the key.
- Restart dev server.
Routes 404 (e.g., /auth/login returns 404)
Routes 404 (e.g., /auth/login returns 404)
Cause: Middleware not installed or placed after route registration.Fix:
- Ensure
app.use(auth(...))runs before routes that depend on authentication. - Confirm package installed:
npm ls @auth0/auth0-hono.
Missing environment variables in production
Missing environment variables in production
Cause: Deployment platform not providing environment variables or using different names.Fix:
- Map environment variables in your hosting provider dashboard to the names used in this quickstart.
- For Cloudflare Workers, verify session/cookie handling is compatible with the platform.
Advanced Usage
- Selective protection: use
app.use(auth({ authRequired: false }))to make routes public by default andapp.use('/private/*', requiresAuth())to protect specific paths. - Silent login: use
attemptSilentLogin()middleware to try silent authentication for better UX. - Custom login flow: call
login({...})to customize forwarded query params,redirectAfterLogin, or silent login options. - Token management: the middleware exposes access and ID tokens via the session; follow least-privilege for scopes and rotate refresh tokens safely.
Best Practices & Security
- Keep secrets out of source control — use environment variables.
- Use a 32+ character
AUTH0_SESSION_ENCRYPTION_KEY. - Set cookie
securetotruein production and set appropriatesameSitepolicy. - Limit token scopes; use audience only when requesting access tokens for APIs.
- Catch
Auth0Exceptioninapp.onErrorto handle auth-specific errors cleanly.