使用 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
我有
格式的 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