Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用RSA256算法生成JWT签名?_Java_Jwt_Rsa_Docusignapi_Signature - Fatal编程技术网

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

Java 如何使用RSA256算法生成JWT签名?,java,jwt,rsa,docusignapi,signature,Java,Jwt,Rsa,Docusignapi,Signature,我有私钥和公钥,并使用私钥初始化签名和公钥验证签名: 最后,我得到了JWT令牌的以下伪值: 2.2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

我有私钥和公钥,并使用私钥初始化签名和公钥验证签名:

最后,我得到了JWT令牌的以下伪值:

2.2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 0skdjvyoZHDEYPC8CI9XEOQF9WF4VJRBBOARXWKVxFNGOHEWPV42NCAXWMGLRESWUKHVMMJBFOKD1CM5BJKVHVLSZWUFTCJLC3XOO9REJAZX78YTY9S5BPXMSZBYR20WHSWJRKp9EWGF7WSGHVxGBJFCPVOTZDC8\U 4B12ToD\U RKjk6n5s8-F7X54KY4K6K6GG7XNK55VDW==

我无法使用此JWT令牌获取accessToken。我将得到回应:

错误:无效的_请求

注意:我使用这个JWT令牌来获取DocuSign应用程序的访问令牌

下面是创建JWT的完整代码。在上面的SECRET中,您需要使用生成JWT时使用的密钥在任何地方定义一个常量

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

您可以下载这些库

下面是创建JWT的完整代码。在上面的SECRET中,您需要使用生成JWT时使用的密钥在任何地方定义一个常量

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


您可以下载库

令牌无效。您应该在问题中包含构建tempAccessToken的代码。当然,问题是您正在向base64编码,它应该是base64url。我添加了用于获取tempAccessToken的代码。您的令牌不是base64url编码的。查看base64url方法。问题中是否包含与代码对应的标记?它似乎没有更新,我已经得到了头和负载Base64编码值并添加。在根据doc.No的值之间,表示base64 url编码的rs256sign。JWT部分必须用base64url编码。请参阅令牌无效。您应该在问题中包含构建tempAccessToken的代码。当然,问题是您正在向base64编码,它应该是base64url。我添加了用于获取tempAccessToken的代码。您的令牌不是base64url编码的。查看base64url方法。问题中是否包含与代码对应的标记?它似乎没有更新,我已经得到了头和负载Base64编码值并添加。在根据doc.No的值之间,表示base64 url编码的rs256sign。JWT部分必须用base64url编码。请看,我只获得了正确格式的所有base64Url值。我的问题是签名。当在JWT.io中使用令牌时,它显示未验证。使用上述代码,它会像一个符咒一样工作,在JWT.io中使用它不会显示未验证。我没有获得str_replace和base64_encode方法。这是生成JWT的规则,为了在jwt.io上验证我们的令牌,我们需要遵循它们遵循的规则。@AkshitAhuja,你的回答没有意义。OP要求提供Java代码,但您提供了PHP。它是非对称RSA密钥所必需的,但您的代码使用的是HMAC。标头中包含的算法sha256不正确,应为HS256,但是OP要求RS256I只获得正确格式的所有base64Url值。我的问题是签名。在JWT.io中使用令牌时,它显示未验证。使用上述代码,它将像一个符咒一样工作,在JWT.io中使用它不会显示未验证。我没有获得stru replace和base64_encode方法。这是生成JWT的规则,为了在jwt.io上验证我们的令牌,我们需要遵循它们遵循的规则。@AkshitAhuja,你的回答没有意义。OP要求提供Java代码,但您提供了PHP。它是非对称RSA密钥所必需的,但您的代码使用的是HMAC。标头中包含的算法sha256不正确,它应该是HS256,但OP要求RS256
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; 
/* 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;