我必须创建一个 JWTClaim,其中包含一个带有 JSON 的属性:
exampleClaimJson = {
"nonce":"13234-3234345-34454",
}
在 Java 中我是这样构建的:
JSONObject exampleClaimJson = new JSONObject();
didJson.put("nonce","13234-3234345-34454");
JWTClaimsSet claimsSet = new JWTClaimsSet.Builder()
.subject(did)
.claim("exampleJson", exampleClaimJson)
.build()
但是在 JWT 内部,“exampleJson”声明是这样表示的:
{
...
"exampleJson": {
"map": {
"nonce":"13234-3234345-34454"
}
}
}
另一方面,如果我使用
.claim("exampleJson", exampleClaimJson.toString())
然后就变成:
{
...
"exampleJson": "{\"nonce\":\"13234-3234345-34454\"}"
}
对我来说,这一切看起来都不好,特别是因为声明的结构将被验证,并且必须只是一个 JSON,而不是带有地图声明,也不是一个简单的字符串。
有谁知道这在Java中是否是正确的方法?我正在看这个 Building JSON Web Token using JSONObject and JSONArray(不过从 2015 年开始..) - minidev 和 java json 对象之间有什么区别?为 Java 项目包含不同的 JSON 库是正常做法吗?
您的代码看起来正确 - 也许存在某种库不兼容?要使用对象声明,请参阅nimbus 测试。这是一些工作代码:
var verifiablePresentationJson = new JSONObject()
verifiablePresentationJson.put("nonce", "13234-3234345-34454")
val did = "did:example:user123"
val claimsSet = new JWTClaimsSet.Builder()
.subject(did)
.claim("verifiablePresentationJson", verifiablePresentationJson)
.build()
System.out.println(claimsSet.toString())
请注意,您应该使用以下类而不是其他实现:
net.minidev.json.JSONObject
通过添加此依赖项来实现此目的,就像 nimbus 项目一样:
implementation("net.minidev:json-smart:2.5.0")