Проверка JWT с помощью jsonwebtoken в node.js с токеном, сгенерированным jose4j HMAC_SHA256 - PullRequest
0 голосов
/ 16 октября 2018

ОК, поэтому у меня есть Back-end Java-сервис, который генерирует JWT с использованием библиотеки jose4j.Это уже работает, и у нас есть несколько других Java-сервисов, которые проверяют эти токены, и все это прекрасно работает.Сейчас я пытаюсь создать сервис NodeJS, и он также должен проверить JWT, которые генерируются исходным сервисом Java.Вот код Java, использующий jose4j для генерации токена.

public static HmacKey getKey() throws UnsupportedEncodingException, NoSuchAlgorithmException {
        MessageDigest md = MessageDigest.getInstance("SHA-256");
        md.update(Vars.SECRET_KEY.getBytes("UTF-8"));
        byte[] key = md.digest();
        return new HmacKey(key);
    }
public String buildJwt(){
JwtClaims claims = new JwtClaims();
            claims.setIssuer(issuer == null ? Vars.NETD_ISSUER : issuer);
            claims.setExpirationTimeMinutesInTheFuture(timeToLiveInMinutes);
            claims.setGeneratedJwtId();
            claims.setIssuedAtToNow();
            claims.setNotBeforeMinutesInThePast(2);
            claims.setSubject(subject);
JsonWebSignature jws = new JsonWebSignature();
            // Add the Claims payload to the JWS
            jws.setPayload(claims.toJson());
            jws.setKey(getKey());
            jws.setAlgorithmHeaderValue(AlgorithmIdentifiers.HMAC_SHA256);
            jwt = jws.getCompactSerialization();
}

Вот код NodeJS, где я пытаюсь проверить JWT.

let decoded = await jwt.verify(token, Buffer.from(config.signature));

config.signature иVars.SECRET_KEY - это те же значения.Но это приводит к «неправильной подписи».

{ JsonWebTokenError: invalid signature
    at C:\Users\jmiles\code\nodeJS\NetDGateway\node_modules\jsonwebtoken\verify.js:122:19
    at getSecret (C:\Users\jmiles\code\nodeJS\NetDGateway\node_modules\jsonwebtoken\verify.js:76:14)
    at Object.module.exports [as verify] (C:\Users\jmiles\code\nodeJS\NetDGateway\node_modules\jsonwebtoken\verify.js:80:10)
    at Object.validateOriForVendor (C:\Users\jmiles\code\nodeJS\NetDGateway\src\utils.js:37:33)
    at getCaseDetail (C:\Users\jmiles\code\nodeJS\NetDGateway\src\operations.js:94:29)
    at Layer.handle [as handle_request] (C:\Users\jmiles\code\nodeJS\NetDGateway\node_modules\express\lib\router\layer.js:95:5)
    at next (C:\Users\jmiles\code\nodeJS\NetDGateway\node_modules\express\lib\router\route.js:137:13)
    at Route.dispatch (C:\Users\jmiles\code\nodeJS\NetDGateway\node_modules\express\lib\router\route.js:112:3)
    at Layer.handle [as handle_request] (C:\Users\jmiles\code\nodeJS\NetDGateway\node_modules\express\lib\router\layer.js:95:5)
    at C:\Users\jmiles\code\nodeJS\NetDGateway\node_modules\express\lib\router\index.js:281:22
    at param (C:\Users\jmiles\code\nodeJS\NetDGateway\node_modules\express\lib\router\index.js:354:14)
    at paramCallback (C:\Users\jmiles\code\nodeJS\NetDGateway\node_modules\express\lib\router\index.js:401:21)
    at oriHelper (C:\Users\jmiles\code\nodeJS\NetDGateway\src\operations.js:234:5) name: 'JsonWebTokenError', message: 'invalid signature' }

1 Ответ

0 голосов
/ 17 октября 2018

Мне удалось получить jsonwebtoken для его проверки, если я изменил метод getKey на следующий.

public static HmacKey getKey() throws UnsupportedEncodingException {
        return new HmacKey(Vars.SECRET_KEY.getBytes("UTF-8"));
    }

, а затем изменил вызов проверки для jsonwebtoken на следующий.

let decoded = await jwt.verify(token, config.signature, config.jwtOptions);

Так что функция verify принимает строку вместо Buffer.from ()

Это не идеально, так как теперь мне нужно сделать запрос на извлечение для службы, которая уже находится в производстве.И для этого изменения потребуется, чтобы все существующие JWT стали недействительными.

...