jose4j 通过 HTTP 代理远程下载 JWK
将支持代理的 Get 实例附加到 HttpsJwks,并保留已配置的密钥集实例,以利用其缓存和后续刷新。
jose4j 的远程密钥集加载器有自己的 HTTP 获取对象。当应用可以调用 API 但无法下载签发者的 JSON Web Keys 时,就配置该对象。
jose4j 0.9.6 的 API 提供了 Get.setHttpProxy 和 HttpsJwks.setSimpleHttpGet:
org.jose4j.http.Get downloader = new org.jose4j.http.Get();
downloader.setHttpProxy(new java.net.Proxy(
java.net.Proxy.Type.HTTP,
new java.net.InetSocketAddress("proxy.example", 8080)));
downloader.setConnectTimeout(5000);
downloader.setReadTimeout(15000);
org.jose4j.jwk.HttpsJwks jwks = new org.jose4j.jwk.HttpsJwks(
"https://issuer.example/keys");
jwks.setSimpleHttpGet(downloader);在应用的密钥解析配置中使用这个已配置的 jwks 对象。在现有解析器旁边创建它,不会改变该解析器的另一个实例。
Get 使用 URL 和 HttpsURLConnection。显式的 Proxy 会传给 URL.openConnection(Proxy);这样就把路由限定在这个加载器上,而无需新增整个 JVM 范围的代理策略。代理认证如果需要,则是额外的传输层问题。经批准且公网可访问的签发者 URL,在允许公共中介且未配置代理账户时,可以使用HTTP 代理列表中的 HTTP 地址。
HttpsJwks 按实例缓存密钥,依据缓存响应头和其默认缓存时长设置。保留该实例才能获得这一好处。已缓存的密钥可以让验证在不访问网络的情况下继续,而之后的获取或刷新仍然取决于所配置的路由。
这里配置的是密钥获取。令牌验证仍然需要应用常规的签名、签发者、受众及其他验证策略;仅获取 JSON 密钥集并不会执行这些检查。