【发布时间】:2018-12-27 06:03:48
【问题描述】:
我有一个PrivateKey 和一个PublicKey 并使用privateKey 来初始化Signature 和publicKey 来验证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 令牌(虚拟值):
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiI4MzliN2NhNC02MDE1LTQ0OWQtOGZiNi02jkyYzk1Ny1jYTNjLTQyMWQtOTk2zY2VkNTAzZGViNWYiLCJleHAiOjE1MzIwMDQwMTcsImF1ZCI6ImFjY291bnQtZC5kb2N1c2lnbi5jb20iLzY29wZSI6InNpZ25hdHVyZSBpbXBlcnNvbmF0aW9uIn0 = .YNZzR0HgPWFm4dXMMHn3czEDRukYUB0Hyw7YP_BGY2dniIMqpH4Ctz5EEHcHrNT_mGImcp026w-isYgv56TTugYnkcAs8HH0YXa1Ey0skdjVYoZHdeyPC8Ci9xeOQF9wf4VjrBboaRxWkVXfngOHHewpV42NcaXxwmGlresWukHVmmjbFokd1Cm5BJKVhVlsZWuftcJlC3XoO9REjaZX78YTY9S5bpXmsZBYr20wHsWJrkP9EWGf7WSGHVXGBJfCpvOTZDC8_4B12ToD_RKjk6n5s8-F7X54KY4kx6Gg7xnk55vDw == P>
我无法使用此 JWT 令牌获取 accessToken。我会收到回复:
“错误”:“无效请求”;
注意:我正在使用此 JWT 令牌来获取 DocuSign 应用程序的访问令牌。
【问题讨论】:
-
令牌无效。您应该在问题中包含正在构建
tempAccessToken的代码。问题肯定是你正在编码base64,它应该是base64url -
我已经添加了用于获取 tempAccessToken 的代码。
-
您的令牌不是 base64url 编码的。查看
base64url方法。您是否在问题中包含了与代码对应的令牌?好像没有更新 -
DocuSign link 我已经获得了标头和有效负载 Base64 编码值并添加“。”根据文档的值之间。
-
不,它说的是 base64 url 编码
rs256sign(<base64URL-encoded header>.<base64URL-encoded body>)。 JWT 部分必须以 base64url 编码。见RFC7519
标签: java jwt rsa docusignapi signature