使用 JWT 安全令牌访问 REST API

Get access to REST API using JWT security token

我有

格式的 RSA 密钥
<RSAKeyValue>
  <Modulus> ..</Modulus>
  <Exponent>..</Exponent>
 ... 
</RSAKeyValue>

我需要使用 java 连接到 REST API。 我应该使用带有模式“TokenIssuer”的 JWT 安全令牌。 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());

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

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