मैंने एक बाकी प्राधिकरण सर्वर लागू किया जो 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 में बदलते हैं और क्लाइंट-साइड पर डिसेरिएलाइज़ेशन को संभालते हैं। हालाँकि, यह बेहतर होगा यदि पैकेज मूल रूप से हमारे लिए (डी) क्रमांकन करता है।

2
Bhushan 25 अगस्त 2021, 19:49

1 उत्तर

सबसे बढ़िया उत्तर

उत्तर इस समस्या का सामना करने वालों के लिए (डी) क्रमांकन के लिए String का उपयोग करना है। तुम क्यों पूछ रहे हो? RFC के अनुसार, JWK JSON प्रारूप में एक स्ट्रिंग है। जबकि nimbusds:nimbus-jose-jwt JWK ऑब्जेक्ट को परिभाषित करता है, कोई भी API जो मान्य JWK (या JWKSet) लौटाता है, यह मान सकता है कि यह एक स्ट्रिंग है।

मैंने यह मुद्दा< भी उठाया था। /a> इस पैकेज के डेवलपर्स के साथ, और उन्होंने (डी) क्रमांकन के लिए String या Map<String, Object> का उपयोग करने की सिफारिश की।

0
Dharman 1 सितंबर 2021, 19:35