如何在JavaScript中生成JWK时设置key_ops参数?
问题描述
我想用JavaScript生成带指定参数的JWK,当前代码如下:
var JA = java.util; var JWKgen = Packages.com.nimbusds.jose.jwk.gen; var Keys = Packages.com.nimbusds.jose.jwk.KeyUse; var ops = Packages.com.nimbusds.jose.jwk.KeyOperation; var alg = Packages.com.nimbusds.jose.Algorithm; var RSAKeyjwk = JWKgen.RSAKeyGenerator(3072) .keyUse(Keys.SIGNATURE) .keyID(JA.UUID.randomUUID().toString()) .algorithm(alg("RS384")) .issueTime(new Date()) .generate();
已成功添加keyUse、KeyId、algorithm参数,现在需要为JWK添加"key_ops":["verify"]和"ext":true属性。尝试过以下几种语法:
.keyOperations(Set(ops['VERIFY'])). .keyOperations(Set(ops.VERIFY)) .keyOperations(Set(ops("VERIFY")))
但出现如下错误:
TypeError: Set objects may not be constructed using "new".
TypeError: Set objects may not be constructed using "new".
Java constructor for "com.nimbusds.jose.jwk.KeyOperation" with arguments "string" not found.
求指导如何正确添加key_ops参数。
解决方案
问题根源在于:当前JavaScript环境中直接调用Set()会创建JS原生Set,但Nimbus SDK要求传入Java的Set对象;同时KeyOperation是枚举类,不能通过字符串构造实例。以下是正确实现方式:
1. 构造符合要求的key_ops集合
使用Java标准库的java.util.Collections工具类创建包含VERIFY操作的Set:
var keyOpsSet = JA.Collections.singleton(ops.VERIFY);
Collections.singleton()会返回一个只包含指定元素的不可变Java Set,完全匹配SDK的参数要求。
2. 添加ext属性
直接调用ext(true)方法即可为JWK添加ext: true属性。
完整修改后的代码
var JA = java.util; var JWKgen = Packages.com.nimbusds.jose.jwk.gen; var Keys = Packages.com.nimbusds.jose.jwk.KeyUse; var ops = Packages.com.nimbusds.jose.jwk.KeyOperation; var alg = Packages.com.nimbusds.jose.Algorithm; var keyOpsSet = JA.Collections.singleton(ops.VERIFY); var RSAKeyjwk = JWKgen.RSAKeyGenerator(3072) .keyUse(Keys.SIGNATURE) .keyID(JA.UUID.randomUUID().toString()) .algorithm(alg("RS384")) .issueTime(new Date()) .keyOperations(keyOpsSet) .ext(true) .generate();
内容的提问来源于stack exchange,提问作者HTech
相关产品推荐
相关产品推荐

