A JWT signer or verifier is built with Algorithm.none(), the unsecured algorithm that produces (and accepts) tokens with no signature.
Why AI tools produce this: AI coding tools produce this regularly, typically when prompted for a shortcut or a quick fix.
Why this matters
An alg=none token can be forged by anyone. Changing the subject, roles, or expiry costs nothing because there is no signature to verify (CWE-347). This is a common AI-generated mistake: the "no signature" algorithm is reached for during prototyping or a Ktor demo and never swapped for a real key.
Sign and verify with a real algorithm and a key from configuration: Algorithm.HMAC256(System.getenv("JWT_SECRET")) or an RSA/EC key, e.g. JWT.require(Algorithm.HMAC256(secret)).build().verify(token).
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.kotlin.jwt.algorithm-none -- <reason>