好的,所以我有一个后端Java服务,该服务使用jose4j库生成JWT。这已经在生产中,我们还有其他几个Java服务正在验证这些令牌,并且一切正常。我现在正在尝试创建NodeJS服务,它还需要验证原始Java服务正在生成的JWT。 这是使用jose4j生成令牌的Java代码。
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();
}
这是我要验证JWT的NodeJS代码。
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' }
答案 0 :(得分:0)
如果我将getKey方法更改为以下内容,则能够获取jsonwebtoken进行验证。
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);
这样,验证函数将使用字符串而不是Buffer.from()
这并不理想,因为现在我需要对已经投入生产的服务进行拉取请求。进行此更改将要求所有现有的JWT都将无效。