---
Runs comprehensive security audit on Auth0 OAuth implementation and generates prioritized remediation checklist.
/plugin marketplace add varaku1012/aditi.code/plugin install auth0-oauth-plugin@aditi-code-pluginsRun a comprehensive security audit on your Auth0 implementation.
/oauth-security-audit
This will check:
Token Storage: In-memory or HTTP-only cookies only (NO localStorage)
grep -r "localStorage.*token" src/PKCE Enabled: For SPAs (Authorization Code + PKCE)
code_verifierState Parameter: CSRF protection
state parameter in custom auth flowHTTPS Enforced: All auth requests over HTTPS
http:// in production callback URLshttps://Token Expiration Short: Access tokens < 15 minutes
Refresh Token Rotation: Enabled for token refresh
Content Security Policy (CSP): Restrict script sources
Content-Security-Policydefault-src 'self'JWT Signature Validation: Verify token signature
jwt.verify() with public keyjwt.decode() (no verification) Audience Validation: Check aud claim matches API
jwt.verify(token, key, { audience: 'https://api.example.com' })aud must match expected audience Issuer Validation: Check iss claim matches Auth0 domain
jwt.verify(token, key, { issuer: 'https://YOUR_DOMAIN/' })iss must match Auth0 domainAlgorithm Validation: Only RS256 (asymmetric)
jwt.verify(token, key, { algorithms: ['RS256'] })HS256 (symmetric, security risk)Scope Validation: Check scopes for authorization
token.scope includes required scopeif (!scopes.includes('delete:items')) return 403No Token in Logs: Sensitive tokens not logged
grep -r "token\|password\|secret" logs/CORS Configured Properly: Only allow trusted origins
app.use(cors({ origin: ['https://myapp.com'] }))origin: '*' (allows any origin)MFA Enabled: Multi-factor authentication required
Password Policy: Strong passwords required
Suspicious Activity Detection: Enabled
Logout Clears Session: User properly logged out
/api/auth/logout clears all session datalogoutParams: { returnTo: safe_url }No Overpermissioned Scopes: Only request necessary scopes
openid profile email)API Keys Secure: Secrets not in version control
.env is in .gitignore ✅git log, public files, commentsRules/Actions Audited: Custom logic secure
GDPR Compliant: User consent, deletion, portability
HIPAA Compliant: (if handling health data)
SOC2 Compliant: If required for compliance
Data Residency: Data stored in correct region
Errors Don't Leak Info: Auth errors are generic
Webhook Errors Handled: Failures don't break auth flow
Audit Logs Enabled: All auth events logged
Sensitive Data Redacted: Logs don't contain secrets
Unit Tests: Auth components tested
npm test includes auth testsIntegration Tests: Auth flow tested end-to-end
Security Tests: Vulnerabilities tested
Count your checkmarks:
// WRONG ❌
localStorage.setItem('token', accessToken)
sessionStorage.setItem('token', accessToken)
// RIGHT ✅
// Use Auth0 SDK (in-memory storage)
// Or for Next.js (HTTP-only cookies)
// WRONG ❌
// No code_verifier or code_challenge
// RIGHT ✅
// Use Auth0 React SDK (automatic PKCE)
// Or custom: include code_verifier in token exchange
// WRONG ❌
const idToken = getIDToken()
fetch('/api/items', {
headers: { Authorization: `Bearer ${idToken}` }
})
// RIGHT ✅
const accessToken = getAccessToken()
fetch('/api/items', {
headers: { Authorization: `Bearer ${accessToken}` }
})
// WRONG ❌
jwt.verify(token, publicKey) // No audience check
// RIGHT ✅
jwt.verify(token, publicKey, {
audience: 'https://api.myapp.com'
})
// WRONG ❌
app.delete('/items/:id', checkJwt, (req, res) => {
// Delete without scope check
res.json({ deleted: true })
})
// RIGHT ✅
app.delete('/items/:id', checkJwt, (req, res) => {
const scopes = req.auth.scope?.split(' ') || []
if (!scopes.includes('delete:items')) {
return res.status(403).json({ error: 'Insufficient permissions' })
}
res.json({ deleted: true })
})
/oauth-security-audit/oauth-troubleshoot for helpScore: [X] / 45 items checked