使用JWT安全令牌访问REST API

时间:2015-03-05 13:40:56

标签: java rsa token jwt

我有格式的RSA密钥

<RSAKeyValue>
  <Modulus> ..</Modulus>
  <Exponent>..</Exponent>
 ... 
</RSAKeyValue>

我需要使用java连接到REST API。 我应该使用JWT安全令牌和模式“TokenIssuer”。 Nimbus库提供了以下示例。它会帮助我还是我需要别的东西?如果是,我应该在哪里写RSA密钥?

// RSA signatures require a public and private RSA key pair,
// the public key must be made known to the JWS recipient in
// order to verify the signatures
KeyPairGenerator keyGenerator = KeyPairGenerator.getInstance("RSA");
keyGenerator.initialize(1024);

KeyPair kp = keyGenerator.genKeyPair();
RSAPublicKey publicKey = (RSAPublicKey)kp.getPublic();
RSAPrivateKey privateKey = (RSAPrivateKey)kp.getPrivate();

// Create RSA-signer with the private key
JWSSigner signer = new RSASSASigner(privateKey);

// Prepare JWT with claims set
JWTClaimsSet claimsSet = new JWTClaimsSet();
claimsSet.setSubject("alice");
claimsSet.setIssueTime(new Date());
claimsSet.setIssuer("https://c2id.com");

SignedJWT signedJWT = new SignedJWT(new JWSHeader(JWSAlgorithm.RS256), claimsSet);

// Compute the RSA signature
signedJWT.sign(signer);

// To serialize to compact form, produces something like
// eyJhbGciOiJSUzI1NiJ9.SW4gUlNBIHdlIHRydXN0IQ.IRMQENi4nJyp4er2L
// mZq3ivwoAjqa1uUkSBKFIX7ATndFF5ivnt-m8uApHO4kfIFOrW7w2Ezmlg3Qd
// maXlS9DhN0nUk_hGI3amEjkKd0BWYCB8vfUbUv0XGjQip78AI4z1PrFRNidm7
// -jPDm5Iq0SZnjKjCNS5Q15fokXZc8u0A
String s = signedJWT.serialize();

// To parse the JWS and verify it, e.g. on client-side
signedJWT = SignedJWT.parse(s);

JWSVerifier verifier = new RSASSAVerifier(publicKey);
assertTrue(signedJWT.verify(verifier));

// Retrieve the JWT claims
assertEquals("alice", signedJWT.getJWTClaimsSet().getSubject());

1 个答案:

答案 0 :(得分:1)

从我的角度来看,如果你想使用RSA,那么我建议使用嵌套的签名和加密的JWT。 通过这种方式,服务器可以使用公钥对JWT进行签名,然后客户端可以使用私钥解密JWT并验证JWT。 从存储密钥的角度来看,您可以将它们存储在文件系统上,提供某种配置属性来指向该文件,或者因为它的公钥,您可以从某些服务获取该密钥,或者您可以从客户端请求它。 在客户端存储私钥时可以采取相同的方法。

但我认为对于大多数情况来说,使用嵌套的签名和加密的JWT以及简单的HMAC保护是可以接受的。 因为客户端将请求身份验证,并且他将收到的令牌发送到服务器,并且服务器将对JWT令牌进行验证。 您可以查看Nimbus示例http://connect2id.com/products/nimbus-jose-jwt/examples/signed-and-encrypted-jwt