我通过包装它并通过Azure API Management缓存它来为下面的发现端点设置缓存。
https://openid-connect-eu.onelogin.com/oidc/.well-known/openid-configuration
所以下面的新链接进行缓存:
https://my.azure-api.net/sso/.well-known/openid-configuration?subscription-key=mykey
以下是令牌验证的政策:
<validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Error: expired token or invalid token" require-expiration-time="true" require-scheme="Bearer" require-signed-tokens="true">
<openid-config url="https://my.azure-api.net/sso/.well-known/openid-configuration?subscription-key=mykey" />
<audiences>
<audience>id</audience>
</audiences>
<issuers>
<issuer>https://openid-connect-eu.onelogin.com/oidc</issuer>
</issuers>
</validate-jwt>
我的问题是,我是否需要缓存上面的发现文档下面的JWKS链接并用于验证?如果是这样,我该如何缓存它?
您需要在尝试验证请求JWT的服务中的某个位置缓存JWKS端点的内容。缓存这些密钥的一种好方法是使用缓存库,该缓存库将在服务级别缓存密钥一段指定的时间。我在我的服务中使用的库被Ben Mames称为caffeine
,可以找到here。以下是如何将JWK缓存30分钟的快速示例:
cache = Caffeine.newBuilder()
.maximumSize(5)
.expireAfterWrite(30, TimeUnit.MINUTES)
.build(k -> jwksMap.get(k));
然后,您的服务可以每30分钟从端点重新获取密钥以刷新缓存。
我不知道您缓存此文档的原因,但APIM从validate-jwt策略中获取元数据端点(https://openid-connect-eu.onelogin.com/oidc/.well-known/openid-configuration)和密钥集端点(https://openid-connect-eu.onelogin.com/oidc/certs)。
返回的html主体上的url被修改并替换为通过APIM缓存的新url。