2017-02-22 1 views
1

Ich verwendeJWT Signatur entspricht nicht lokal berechnete Signatur

JwtBuilder builder = Jwts.builder() 
        .setId(user.getEmail()) 
        .signWith(signatureAlgorithm, signingKey); 

ein Token erstellen dann

Jwts.parser().setSigningKey(secret).parse(token); 

zu authentifizieren. Wenn ich dies in einem JUnit-Test ausführe, funktioniert es gut. Wenn ich jedoch ein Token authentifiziere, das als Header über den REST-Aufruf übergeben wurde, schlägt die Authentifizierung mit SignatureException fehl. Ich habe das Token an beiden Enden des HTTP-Aufrufs verifiziert und die Token-Zeichenfolge ist identisch. Der Code zum Erstellen/Authentifizieren ist statisch, daher ist das Geheimnis auf jeder Seite gleich. Irgendwelche Hinweise

+0

beginnt Können Sie ein Beispiel-Token und den geheimen Schlüssel posten? – pedrofb

+0

statisch Schlüssel secret = MacProvider.generateKey(); Signaturalgorithmus signatureAlgorithm = Signaturalgorithmus.HS256; byte [] apiKeySecretBytes = geheim.getEncoded(); Schlüssel signingKey = new SecretKeySpec (apiKeySecretBytes, signatureAlgorithm.getJcaName()); – stanlick

Antwort

2

static Key secret = MacProvider.generateKey(); ein neues zufälliges Schlüssel jedes Mal, wenn Ihr Server generiert wird neu geladen, weil statische Variablen initialisiert werden, wenn die Klasse geladen wird

Es bedeutet, dass, wenn Sie einen JWT aus, diese wird nur dann gültig ist, solange die Server startet nicht neu. Die SignatureException Sie bekam, weil die Signaturschlüssel ist es anders

Sie benötigen die Unterzeichnung Schlüssel secret.getEncoded() nach der ersten Generation zu speichern und laden, wenn Ihr Modul

+0

Große Beobachtung. Ich habe jedoch eine einzige Dienstprogrammklasse auf dem Server, die die einzige Referenz auf diesen statischen Schlüssel ist. Es verwendet diese einzelne Referenz für Erstellungs- und Authentifizierungsoperationen. Deshalb ist es so verwirrend. – stanlick

+0

Nur um zu überprüfen, dass es kein anderes verstecktes Problem gibt: Könnten Sie den Schlüsselinhalt vor dem Signieren und Verifizieren drucken? Beispiel: System.out.println (DatatypeConverter.printHexBinary (secret.getEncoded())) – pedrofb

+0

@stanlick, Haben Sie überprüft, ob der geheime Code beim Signieren und Verifizieren der gleiche war? – pedrofb

Verwandte Themen