A JWT payload is read by hand (json_decode(base64_decode($parts[1])) on the second dot-segment of a token) without ever verifying the signature.
Why AI tools produce this: AI coding tools generate this anti-pattern by default, it appears in a large share of AI-written auth code.
Why this matters
The claims (user id, roles, scopes) are trusted straight from an attacker- controllable string, so anyone can forge a token with any identity and it will be accepted (CWE-347). This is a common AI-generated shortcut: the model "decodes" the token to read a claim and skips verification entirely.
Verify the signature with the library instead, pinning the algorithm and a key from configuration: use Firebase\JWT\JWT; use Firebase\JWT\Key; $claims = JWT::decode($jwt, new Key($_ENV['JWT_SECRET'], 'HS256'));
Suppressing this rule
If a finding is a genuine false positive, scope the suppression to the exact line and leave a reason, never disable the rule project-wide. Disable directives are line-scoped by design.
// oauthlint-disable-next-line auth.php.jwt.manual-decode-no-verify -- <reason>