2017-06-25 10 views
0

Ich versuche JWT Authentifizierung meine Vert.x Anwendung hinzuzufügen und das ist, was ich bisher getan haben:
erzeugte Schlüsselspeicher mit dem folgenden Befehl:Signaturprüfung fehlgeschlagen Vert.x

keytool -genseckey -keystore keystore.jceks -storetype JCEKS -storepass Geheimnis -keyalg HMACSHA256 -keysize 2048 -alias HS256 -keypass Geheimnis

wie es here empfohlen.
Da ist in meiner Startmethode I initialisiert JWTAuth Beispiel:

jwt = JWTAuth.create(vertx, new JsonObject() 
        .put("keyStore", new JsonObject() 
        .put("type", "jceks") 
        .put("path", "keystore.jceks") 
        .put("password", "secret"))); 

Und hinzugefügt Handler für api Route:

router.route("/api/create_room") 
      .blockingHandler(JWTAuthHandler.create(jwt)); 

Nun, wenn ich eine Anfrage mit einigen Bearer-Token in der Autorisierungs-Senden header ich:

WARNING: JWT decode failure 
java.lang.RuntimeException: Signature verification failed 

ich das Token here getestet haben und es sagt, dass die Unterschrift korrekt verifiziert wird.
Habe ich etwas falsch gemacht? Oder ist es ein Fehler in einer vert.x-Bibliothek?

UPD

private static final String DEFAULT_ALGORITHM = "HMACSHA256"; 
@Override 
    public synchronized byte[] sign(byte[] payload) { 
    SecretKey sk = new SecretKeySpec("secret".getBytes(), DEFAULT_ALGORITHM); 
    try { 
     mac.init(sk); 
     return mac.doFinal(payload); 
    } catch (GeneralSecurityException e) { 
     throw new RuntimeException(e); 
    } 

    } 

Ich habe, offensichtlich sk zu Testzwecken hinzugefügt. Ich denke, es gibt ein Problem während der Initialisierung cryptoMap.

Antwort

0

Der Fehler, den Sie sehen, bedeutet, dass das Parsen des Tokens gemäß site you linked korrekt ist, die Signatur jedoch nicht mit dem Inhalt des Tokens übereinstimmt.

Sie initialisieren den JWT mit Ihrer benutzerdefinierten Signatur, so dass Sie nur Tokens überprüfen können, die Sie selbst ausgestellt haben. Wie gibst du die Token aus?

Mit anderen Worten können nur von Ihnen erstellte Token verifiziert werden.

+0

Die Token werden mit Spring-Security-JWT erstellt. Der Prozess endet im Grunde mit 'Signer signer = new MacSigner (secret); Jwt jwt = JwtHelper.encode (Inhalt, Unterzeichner); ' Aber ich kenne das Geheimnis, was im Grunde bedeutet, dass ich das Token entschlüsseln kann. Ich habe überprüft, dass das Geheimnis, das beim Signieren des Tokens verwendet wird, dasselbe ist wie beim Überprüfen der Signatur in der vert.x App. –

+0

der Mac wird nicht initialisiert, als ich die 'sign' Methode in der' Crypto' Klasse durch Hinzufügen von 'mac.init (sk); Ich bin nicht so gut in diesem Verschlüsselungskram, kannst du meinen Vorschlag bestätigen? –

+0

Was ist die Variable 'sk'? kannst du deinen modifizierten Code teilen? –