Harsh Vardhan Goswami
Aug 1, 2025
If you're dealing with a mixed tech stack—Next.js, Express/Deno/Huno APIs, Python APIs, Go microservices, Rust server, or even legacy systems—authentication is one of the first pain points you'll encounter. The NGINX Auth Proxy comes to the rescue by acting as a centralized, encrypted JWT (JWE token) validation layer. It’s fast, secure, and highly configurable.
Why You Need This
Unified Authentication: As your stack grows, you’ll want all your services to authenticate users consistently. Without a centralized solution, you’ll be duplicating auth logic across services. Painful, right?
Bridge Legacy Systems: Want to slap modern authentication on old-school systems that don’t know what a JWT is? This proxy does the job.
Performance Boost: By caching user validation results in Redis, it minimizes database hits, ensuring your system runs fast even under heavy loads.
Seamless Integration: Whether you’re working with Auth.js tokens in your frontend or need to secure APIs, this proxy makes it easy to plug and play.
Why It Works
The NGINX Auth Proxy leverages:
Encrypted JWT Validation: Decrypts and validates Auth.js-issued JWE tokens, ensuring secure session management.
Redis Caching: Reduces PostgreSQL queries by storing user validation results for a configurable TTL.
Database Lookups: Verifies users in PostgreSQL to ensure they actually exist in your system.
Flexible Configs: Everything’s controlled via environment variables, making it easy to adapt to your setup.
How It Works
Here’s the meat of it.
1. JWE Token Validation
The proxy starts by extracting the encrypted JWT (JWE token) from cookies. The Lua script calls the decrypt_jwe.ts
script, which uses the jose
library to decrypt and validate the token.

If the token is invalid or expired, the proxy immediately rejects the request.
2. Redis Caching
Once the user ID is extracted from the JWE token, the proxy checks Redis for a cached entry. If the user exists in the cache, it skips the database check and grants access.
3. PostgreSQL Validation
If the user isn’t cached, the proxy queries PostgreSQL to confirm their existence. If valid, the result gets cached in Redis to speed up future requests.

4. Bypass Mode
For development or debugging, you can enable a bypass mode using environment variables. This lets requests through without auth checks—useful for testing but dangerous in production.
How to Set It Up
Step 1: Configure Environment Variables
Here’s a quick rundown:
JWE Token Configs:
JWT_SECRET
: The secret key for decryption.
JWT_SALT
: Salt for Auth.js tokens.
Redis Configs:
REDIS_HOST
, REDIS_PORT
: Redis connection details.
REDIS_CACHE_TTL
: Cache expiration time in seconds.
PostgreSQL Configs:POSTGRES_HOST
, POSTGRES_PORT
, POSTGRES_DB
, POSTGRES_USER
: DB connection details.
Feature Flags:
ENABLE_DB_CHECK
: Enable/disable PostgreSQL validation.
ALLOW_BYPASS
: Enable bypass mode for testing.
Step 2: Deploy the Proxy
Deploy this Dockerfile.
Step 3: Secure Your Apps
Place APIs, microservices, or static sites behind the proxy. Use Auth.js in your frontend to issue JWE tokens (or even in your express server) .Let the proxy handle token validation, caching, and user checks.
lightbulb_2
Pro tip
Always prioritize security when configuring your NGINX Auth Proxy, whether securing modern apps or retrofitting legacy systems. Follow these essentials to reduce risk:
Area | Best Practice |
---|---|
Transmission | Enforce HTTPS everywhere, never use HTTP for auth |
JWT Cookie Handling | Set HttpOnly, Secure, SameSite flags |
Token & Secret Handling | Use strong algorithms, rotate secrets, store them securely |
Logging & Auditing | Log auth events (never tokens), integrate with alerting systems |
Attack Protection | Rate limit clients, short token expirations, replay/user checks |
Privilege | Run as non-root, restrict network access |
Bypass/Audit Mode | Never use ALLOW_BYPASS in production, log all bypass use |
A security-first approach with these simple policies dramatically lowers the chances of breaches and ensures your authentication layer is ready for production and beyond.
When to Use It
Microservices: Protect APIs written in different languages without duplicating auth logic.
Legacy Systems: Add modern Auth.js-based session management to old-school apps.
Static Sites: Secure static sites or admin panels with minimal effort.
Third-Party Integrations: Authenticate users for tools like Grafana or Jenkins using your existing Auth.js tokens.
Final Thoughts
The NGINX Auth Proxy is a dev-friendly solution for handling encrypted JWTs (JWE tokens) in multi-language environments. Whether you’re scaling microservices or retrofitting legacy systems, it’s a robust and high-performing tool that simplifies authentication workflows.
Github Repo, can be found here.