If you’re getting 401 and 400 intermittently from the upstream service, that strongly suggests authentication-related issues, often tied to token forwarding, expiration, or format mismatch.
🔁 Quick Summary of Key Differences
| Status | Meaning | Common Cause |
|---|---|---|
| 401 | Unauthorized | Missing/invalid/expired credentials |
| 400 | Bad Request | Malformed or incomplete request (e.g. OIDC token request) |
🧠 Intermittent 401 + 400: Common Root Causes
🔸 1. Expired or Reused Tokens
- Kong gets a token once, caches it, and keeps using it—but upstream expects a fresh one.
- Especially common with client credentials or authorization code flows.
Solution:
- Set token caching to short duration or disable it in the OIDC plugin:
config: cache_ttl: 0 # Or a very short TTL like 5
🔸 2. Multiple Consumers with Invalid Secrets
- One client (consumer) is configured correctly, others are not.
- You see 401/400 when the bad client makes a request.
Solution:
- Enable verbose logging in Kong:
export KONG_LOG_LEVEL=debug kong reloadThen correlateconsumer_idwith the error.
🔸 3. Kong Not Forwarding Tokens Correctly
- Kong authenticates but doesn’t forward
Authorizationheader to the upstream. - Some plugins strip headers by default.
Solution:
- Add request-transformer plugin to pass the token:
curl -X POST http://localhost:8001/services/YOUR_SERVICE/plugins \ --data "name=request-transformer" \ --data "config.add.headers=Authorization:Bearer $(jwt_token)"
🔸 4. OIDC Plugin Misconfiguration
If you’re using the OpenID Connect plugin:
grant_type,client_id, orredirect_urimay be wrong or missing intermittently.- Kong might request a new token but fail to pass a correct one.
Check:
- Kong OIDC plugin config
- Errors like:
error=invalid_request error_description="Unsupported client authentication method"
🧪 How to Debug Effectively
- Set
KONG_LOG_LEVEL=debug, reload Kong, and tail the logs:tail -f /usr/local/kong/logs/error.log - Inspect Upstream Request:
- Look for what headers/body Kong is sending.
- Especially
Authorization,Content-Type, and request body if OIDC is involved.
- Track Errors to a Specific Consumer:
- Use
consumer_idin the access log to trace. - Maybe only some consumers are misconfigured.
- Use
- Try Curling the Upstream Directly with the exact payload Kong sends (use Postman or curl):
curl -X POST https://upstream/token \ -H "Authorization: Bearer <your_token>" \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "grant_type=client_credentials&client_id=...&client_secret=..."
to check
- Kong plugin configs (especially OIDC/JWT)
- A few lines from Kong’s debug logs showing the upstream request/response
- Whether you’re using Ping Identity or a custom upstream