JWT decoded but never verified. The signature is never checked, so claims can be forged.
A static-analysis linter for the OAuth, OIDC, JWT, MCP, session, and CORS anti-patterns that AI coding tools generate by default, including GitHub Copilot, Cursor, and Claude Code. 270+ hand-curated rules spanning eleven languages, from JavaScript and Python to Go, C#, and Kotlin, plus mobile auth (Swift/iOS, Android) and a dedicated pack for MCP server auth. Tuned for zero false positives on the clean auth libraries developers actually depend on.
// AI writes auth from a decade of insecure examples. These are the bugs it ships, and the ones OAuthLint catches. Read our own measurement →
LLMs learned auth from a decade of insecure answers. The code compiles, passes your tests, and ships a token-forgery bug. Here is exactly how OAuthLint reports each one.
JWT decoded but never verified. The signature is never checked, so claims can be forged.
Access token in localStorage is readable by any XSS. It cannot be protected from script.
Authorization request without state (and PKCE) is open to CSRF and code interception.
Reflecting the request Origin with credentials defeats the same-origin policy entirely.
Run it locally, on every PR via the GitHub Action, inline as you type in VS Code, or right inside your AI coding tool with the MCP server, so the model checks its own auth code before it reaches you.
Findings rank critical → info, each mapped to CWE/OWASP. Near-zero false positives means every red line is worth your time.
Many rules rewrite the code for you with --fix (preview with --fix-dry-run). The rest ship a vulnerable and a corrected snippet, so the fix is copy-paste obvious, not a CWE number to look up.
A linter is only as useful as its precision. We hold OAuthLint to a hard silence bar on clean libraries, then measure how often these anti-patterns actually show up in AI-generated code.
Fire on a correct, idiomatic auth library and that's a bug in the rule. It doesn't ship.
// measured aggregate figures from our own scan. Full methodology & dataset on the research page.
The rule pack grows with the ecosystem. Today it covers these languages and mobile auth (Swift/iOS, Android), with more landing every release.
PR annotations on the exact line, plus SARIF upload to code scanning.
Inline diagnostics as you type, in VS Code, Cursor, Windsurf, and every JetBrains IDE. Squiggle on the call, hover for the fix.
Exit non-zero on a threshold you set. JSON, SARIF or pretty output.
OAuthLint runs on Semgrep's engine, and we love it. But a generic engine with a thousand community rules is a different thing from a curated, auth-only ruleset with dataflow, taint tracking, and a precision guarantee. That gap is the work we do so you don't have to.
Rules chosen and tuned for AI-generated auth code, not thousands of generic patterns you have to triage.
A hard 0-false-positive bar on real auth libraries. Every benchmark finding hand-verified before release.
Vulnerable + safe example for every rule, mapped to CWE/OWASP. The remediation is in the finding.
No signup, no config, no account. Point it at your source and read the findings.