使用 JWT 安全令牌访问 REST API

Posted

技术标签:

【中文标题】使用 JWT 安全令牌访问 REST API【英文标题】:Get access to REST API using JWT security token 【发布时间】:2015-05-06 21:39:18 【问题描述】:

我有 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());

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

感谢您的解释。我已经通过使用此链接完成了它connect2id.com/products/nimbus-jose-jwt/examples/…TokenIssuer 只是标题中“iss”参数的名称。顺便说一句,当 Web 服务为我提供 JWT 令牌示例时,我很快就明白了在 header 和 body 中设置什么。我只需要解密它。

以上是关于使用 JWT 安全令牌访问 REST API的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django 的单个 API 中获取访问令牌和刷新令牌(rest_framework_jwt)

JWT 访问令牌和刷新令牌安全性

REST API 的安全认证,从 OAuth 2.0 到 JWT 令牌

在 Rest API 中使用 Facebook 在 Express 和 NodeJS 中维护 JWT 的密钥和访问令牌

JWT 似乎不是 REST API 的安全解决方案

Spring Boot 安全性 - 允许使用过期 JWT 令牌的用户请求