java - 如何使用 RSA256 算法生成 JWT 签名?

标签 java jwt rsa docusignapi signature

我有一个 PrivateKeyPublicKey并使用 privateKey初始化 SignaturepublicKey验证 Signature :

KeyFactory keyFactory = KeyFactory.getInstance("RSA"); 

// decode public key
X509EncodedKeySpec publicSpec = new X509EncodedKeySpec(pubKeyBytes);
RSAPublicKey pubKey = (RSAPublicKey) 
keyFactory.generatePublic(publicSpec);

//decode private key
PKCS8EncodedKeySpec privSpec = new PKCS8EncodedKeySpec(prvKeyBytes);
RSAPrivateKey privKey = (RSAPrivateKey) 
keyFactory.generatePrivate(privSpec);

//header and body Base64 decoded value
String headerString = mapper.writeValueAsString(header);
String headerEncoded = 
Base64.getUrlEncoder().encodeToString(headerString.getBytes());
String payloadString = mapper.writeValueAsString(payload);
String payloadEncoded = 
Base64.getUrlEncoder().encodeToString(payloadString.getBytes());
String tempAccessToken = hearderEncoded+"."+payloadString;

Signature sign = Signature.getInstance("SHA256withRSA");
sign.initSign(privKey);
sign.update(tempAccessToken.getBytes("UTF-8"));
byte[] signatureBytes = sign.sign();
sign.initVerify(pubKey);
sign.update(tempAccessToken.getBytes("UTF-8"));     

String jsonToken = Base64.getUrlEncoder().encodeToString(signatureBytes);
String JWTtoken = tempAccessToken + "." + jsonToken; 

最后我得到下面的 JWT token (虚拟值):

eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiI4MzliN2NhNC02MDE1LTQ0OWQtOGZiNi02jkyYzk1Ny1jYTNjLTQyMWQtOTk2zY2VkNTAzZGViNWYiLCJleHAiOjE1MzIwMDQwMTcsImF1ZCI6ImFjY291bnQtZC5kb2N1c2lnbi5jb20iLzY29wZSI6InNpZ25hdHVyZSBpbXBlcnNvbmF0aW9uIn0=.YNZzR0HgPWFm4dXMMHn3czEDRukYUB0Hyw7YP_BGY2dniIMqpH4Ctz5EEHcHrNT_mGImcp026w-isYgv56TTugYnkcAs8HH0YXa1Ey0skdjVYoZHdeyPC8Ci9xeOQF9wf4VjrBboaRxWkVXfngOHHewpV42NcaXxwmGlresWukHVmmjbFokd1Cm5BJKVhVlsZWuftcJlC3XoO9REjaZX78YTY9S5bpXmsZBYr20wHsWJrkP9EWGf7WSGHVXGBJfCpvOTZDC8_4B12ToD_RKjk6n5s8-F7X54KY4kx6Gg7xnk55vDw==



我无法获得 accessToken使用此 JWT token 。我会得到回应:

"error" :"invalid_request";



注意 : 我正在使用这个 JWT token 来获取 的访问 token DocuSign 申请 .

最佳答案

/* Header */
$header = json_encode(['typ' => 'JWT', 'alg' => 'sha256']);

/* Payload */
$payload = json_encode(['logged_in_id' => 1, 'logged_in_name' => 'Test', 'logged_in_username' => 'test']);

// Encode Header to Base64Url String
$base64UrlHeader = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($header));

// Encode Payload to Base64Url String
$base64UrlPayload = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($payload));

// Create Signature Hash
$signature = hash_hmac('sha256', $base64UrlHeader . "." . $base64UrlPayload, SECRET, true);

// Encode Signature to Base64Url String
$base64UrlSignature = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($signature));

// Create JWT
$jwt = $base64UrlHeader . "." . $base64UrlPayload . "." . $base64UrlSignature;

这是创建 JWT 的完整代码。在上面的 SECRET 中,您需要使用将在生成 JWT 时使用的 key 在任何地方定义该常量。

此代码是生成 JWT 的核心代码,但您也可以使用任何可以简化任务的库,因为您不需要编写完整的代码,您只需要包含该库并调用函数并传递所需的参数只要。

您可以下载库 here

关于java - 如何使用 RSA256 算法生成 JWT 签名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51416906/

相关文章:

cryptography - Linux内核是否支持RSA加密/解密?

java - Jackson是否支持JsonPath注解

java - 单击下拉按钮后,如何清除组合框中选择的默认值?

google-cloud-platform - 针对 Google IAP 使用 Salesforce 命名凭据

authentication - ASP.Net Core - API 身份验证错误没有重定向

php - 为什么 Linux 或 Windows 下的私钥字符串不同?

java - 是否可以从私钥的 byte[] 数组中恢复 RSA 公钥?

java - 什么是类型和类型 token ?

java - Selenium2 和 webdriver 的一个很好的工作示例

django - 注册后通过电子邮件而不是 URL 发送激活码