JWT 验证:通过 Azure API 管理缓存从缓存发现文档派生的 JWKS

JWT Validation: Caching JWKS derived from cached discovery document via Azure API Management

我通过包装它并通过 Azure API 管理缓存它来为下面的发现端点设置缓存。

https://openid-connect-eu.onelogin.com/oidc/.well-known/openid-configuration

所以下面的新 link 进行缓存:

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 link,它位于上面的发现文档中并用于验证?如果是这样,我该如何缓存它?

https://openid-connect-eu.onelogin.com/oidc/certs

您需要将 JWKS 端点的内容缓存在您尝试验证请求 JWT 的服务中的某处。缓存这些键的一种好方法是使用缓存库,该库将在服务级别缓存键一段指定的时间。我在服务中使用的库被 Ben Mames 称为 caffeine,可以在 here 上找到。这是一个快速示例,说明如何将 JWK 缓存 30 分钟:

cache = Caffeine.newBuilder()
        .maximumSize(5)
        .expireAfterWrite(30, TimeUnit.MINUTES)
        .build(k -> jwksMap.get(k));

然后您的服务可以每 30 分钟从端点重新获取密钥以刷新缓存。

我不知道您缓存此文档的原因,但元数据端点 (https://openid-connect-eu.onelogin.com/oidc/.well-known/openid-configuration) 和 密钥集端点 (https://openid-connect-eu.onelogin.com/oidc/certs) 由 APIM 从 validate-jwt 策略中获取。

返回的 html 正文中的 url 已修改并替换为通过 APIM 缓存的新 url。