Fehlermeldung
invalid algorithm
Was der Fehler bedeutet
Der Wert im Header alg des Tokens steht nicht in der Liste der Algorithmen, die deine prüfende Seite akzeptiert. jsonwebtoken prüft das, bevor es die Signatur überhaupt anfasst, das Token kann also einwandfrei signiert sein – nur mit einem Verfahren, das du nicht zugelassen hast. Diese Sperre ist eine Sicherheitsfunktion, die wie vorgesehen arbeitet, kein Parsing-Bug.
Warum der Fehler auftritt
Aussteller und prüfende Seite sind sich nach einer Migration uneinig
häufigDer Aussteller ist von RS256 auf ES256 umgestiegen (oder umgekehrt), aber die prüfende Seite hält in der Allowlist ihrer Option algorithms noch am alten Wert fest. Jedes frische Token scheitert dann, während alte zwischengespeicherte noch durchgehen, wodurch der Rollout wie ein sporadischer Fehler aussieht.
Allowlist aus dem falschen Schlüsseltyp abgeleitet
häufigÜbergibst du keine Option algorithms, leitet jsonwebtoken seit v9 die Allowlist aus dem Schlüssel ab: Gib ihm einen öffentlichen RSA-Schlüssel, und ES256-Tokens sind „invalid algorithm“, auch wenn du sie zulassen wolltest. Ein EC-Schlüssel, während nur RS256 erlaubt ist, scheitert genauso. (Ein RSA-Schlüssel mit algorithms: ["ES256"] kommt an dieser Prüfung vorbei und scheitert an der nächsten, mit „"alg" parameter for "rsa" key type must be one of: RS256, PS256, …“.)
Ein Token von einem anderen Aussteller
gelegentlichMandantenfähige Systeme erhalten manchmal Tokens, die ein anderer Identity Provider mit einem anderen Signaturverfahren ausgestellt hat. Der abweichende alg ist dann nur ein Symptom – das eigentliche Problem ist, dass das Token diese prüfende Seite überhaupt nicht erreichen sollte.
So behebst du den Fehler
- 1.
Allowlist auf das festlegen, was der Aussteller wirklich verwendet
Dekodiere den Header, um den tatsächlichen alg zu sehen, und setze die Allowlist dann auf genau diesen Wert – und stelle sicher, dass der Schlüsseltyp passt (EC-Schlüssel für ES256, RSA-Schlüssel für RS256).
js const { header } = jwt.decode(token, { complete: true }); console.log(header.alg); // e.g. "ES256" jwt.verify(token, ecPublicKeyPem, { algorithms: ["ES256"] }); - 2.
Algorithmuswechsel in zwei Phasen ausrollen
Während einer Rotation von Schlüssel und Algorithmus müssen prüfende Dienste kurzzeitig beide Verfahren akzeptieren – jedes über kid an seinen eigenen Schlüssel gebunden – und danach wieder auf eines zurückgehen.
js // transition window only: jwt.verify(token, keyForKid(header.kid), { algorithms: ["ES256", "RS256"] }); // after all RS256 tokens expired: jwt.verify(token, ecPublicKeyPem, { algorithms: ["ES256"] });