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

问题描述 投票:0回答:2

我通过包装它并通过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链接并用于验证?如果是这样,我该如何缓存它?

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

azure azure-api-management
2个回答
0
投票

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

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

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


0
投票

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


0
投票

返回的html主体上的url被修改并替换为通过APIM缓存的新url。

© www.soinside.com 2019 - 2024. All rights reserved.