मैंने एक बाकी प्राधिकरण सर्वर लागू किया जो com.nimbusds:nimbus-jose-jwt:9.13
पैकेज का उपयोग करके JWK प्रारूप में दिए गए keyId के लिए सार्वजनिक-कुंजी लौटाता है। कोड कुछ इस तरह दिखता है:
@RequestMapping(value = "/oauth2", produces = APPLICATION_JSON_VALUE)
public interface Rest {
...
@GetMapping("/public-key/{keyId}")
@Operation(summary = "Return the public key corresponding to the key id")
JWK getPublicKey(@PathVariable String keyId);
}
public class RestController implements Rest {
.....
public JWK getPublicKey(String keyId) {
byte[] publicKeyBytes = ....
RSAPublicKey publicKey = (RSAPublicKey) keyFactory.generatePublic(new X509EncodedKeySpec(publicKeyBytes));
JWK jwk = new RSAKey.Builder(publicKey)
.keyID(keyId)
.algorithm(new Algorithm(publicKey.getAlgorithm()))
.keyUse(KeyUse.SIGNATURE)
.build();
return jwk;
}
}
यह कोड निम्नलिखित प्रारूप में एक JWK कुंजी देता है:
{
"keyStore": null,
"private": false,
"publicExponent": {},
"modulus": {},
"firstPrimeFactor": null,
"secondPrimeFactor": null,
"firstFactorCRTExponent": null,
"secondFactorCRTExponent": null,
"firstCRTCoefficient": null,
"otherPrimes": [],
"requiredParams": {
"e": "some-valid-exponent",
"kty": "RSA",
"n": "some-valid-modulus"
},
"privateExponent": null,
"x509CertChain": null,
"algorithm": {
"name": "RSA",
"requirement": null
},
"keyOperations": null,
"keyID": "some-valid-key-id",
"x509CertURL": null,
"x509CertThumbprint": null,
"x509CertSHA256Thumbprint": null,
"parsedX509CertChain": null,
"keyUse": {
"value": "sig"
},
"keyType": {
"value": "RSA",
"requirement": "REQUIRED"
}
}
क्लाइंट साइड (जावा) पर, मैं निम्नलिखित कोड के साथ jwk को पार्स करने का प्रयास करता हूं:
public JWK getPublicKey(String keyId) {
String json = restTemplate.getForObject(publicUrl + "/oauth2/public-key/" + keyId, String.class);
try {
return JWK.parse(json);
} catch (ParseException e) {
log.error("Unable to parse JWK", e);
return null;
}
}
हालांकि, क्लाइंट कुंजी को पार्स करने में असमर्थ है क्योंकि parse
एक अपवाद (Missing parameter "kty"
) फेंकता है। मैं देखता हूं कि JWK.parse
को मुख्य JWT josn बॉडी में एक kty
कुंजी की आवश्यकता होती है, जबकि JWK
का डिफ़ॉल्ट क्रमांकन kty
कुंजी को requiredParams
कुंजी के भीतर एम्बेड करता है। जब मैं jwk.toString()
का प्रयास करता हूं, तो मुझे मुख्य json बॉडी में kty
कुंजी दिखाई देती है।
मूल JWK ऑब्जेक्ट का क्रमांकन/डिसेरिएलाइज़ेशन सीधे-सीधे तरीके से काम क्यों नहीं करता है? एक कस्टम जेडब्ल्यूटी संरचना या एक धारावाहिक/deserializer लागू किए बिना इसे ठीक करने का सबसे अच्छा तरीका क्या होगा?
अपडेट 1: यह कोड काम करेगा यदि हम रिटर्न प्रकार को JWK
से Map<String, Object>
या String
में बदलते हैं और क्लाइंट-साइड पर डिसेरिएलाइज़ेशन को संभालते हैं। हालाँकि, यह बेहतर होगा यदि पैकेज मूल रूप से हमारे लिए (डी) क्रमांकन करता है।
1 उत्तर
उत्तर इस समस्या का सामना करने वालों के लिए (डी) क्रमांकन के लिए String
का उपयोग करना है। तुम क्यों पूछ रहे हो? RFC के अनुसार, JWK JSON प्रारूप में एक स्ट्रिंग है। जबकि nimbusds:nimbus-jose-jwt
JWK ऑब्जेक्ट को परिभाषित करता है, कोई भी API जो मान्य JWK (या JWKSet
) लौटाता है, यह मान सकता है कि यह एक स्ट्रिंग है।
संबंधित सवाल
नए सवाल
java
जावा एक उच्च स्तरीय प्रोग्रामिंग भाषा है। इस टैग का उपयोग तब करें जब आपको भाषा का उपयोग करने या समझने में समस्या हो। इस टैग का उपयोग शायद ही कभी किया जाता है और इसका उपयोग अक्सर [वसंत], [वसंत-बूट], [जकार्ता-ई], [Android], [javafx], [हडूप], [श्रेणी] और [मावेन] के साथ किया जाता है।