com.auth0.jwk組織下面的jwks-rsa包,主要實現的是透過公鑰對jwt的簽名進行驗證,在這個包中,它使用了包裝器
的設計模式,對預設的jwks提供者新增了一快取的支援,透過建立一個GuavaCachedJwkProvider
類,傳入一個預設的UrlJwkProvider
來將這個Provider進行包裝,讓它具有快取的能力!
包裝器模式
包裝器模式(Wrapper Pattern)是一種結構型設計模式,它允許在不改變原始物件介面的情況下,動態地向物件新增新的功能。包裝器模式透過建立一個包裝類,將原始物件作為包裝類的成員,並在包裝類中定義額外的行為或功能來擴充套件原始物件的功能。
以下是包裝器模式的一些關鍵角色和特點:
-
Component(元件):定義了被包裝物件的介面,可以是一個抽象類或介面。
-
ConcreteComponent(具體元件):實現了Component介面,是被包裝的原始物件。
-
Wrapper(包裝器):也稱為Decorator,持有一個指向Component的引用,並實現了與Component相同的介面。在包裝器中可以新增額外的功能,以增強原始物件的行為。
包裝器模式的優點包括:
- 靈活性:可以動態地為物件新增新的功能,而無需修改原始物件的程式碼。
- 遵循開閉原則:可以在不修改現有程式碼的情況下擴充套件物件的功能。
- 簡化程式碼:將功能分散到多個小類中,避免了單個類變得龐大複雜。
總的來說,包裝器模式可以幫助我們在執行時動態地為物件新增新的功能,同時保持程式碼的靈活性和可維護性。常見的應用場景包括日誌記錄、快取、加密等功能的動態新增。
jwks-rsa中的體現
- 元件 JwkProvider
- 具體元件 UrlJwkProvider
- 包裝器
- GuavaCachedJwkProvider 快取能力
- RateLimitedJwkProvider 限流能力
我們為UrlJwkProvider進行快取的包裝
/**
* 快取包裝器.
* @throws MalformedURLException
* @throws JwkException
*/
@Test
public void jwkReadCacheWrapper() throws MalformedURLException, JwkException {
UrlJwkProvider jwkProvider = new UrlJwkProvider(new URL(jwksUrl));
JwkProvider cachedJwkProvider = new GuavaCachedJwkProvider(jwkProvider);
Jwk jwk = cachedJwkProvider.get("certsId");
Algorithm algorithm = Algorithm.RSA256((RSAPublicKey) jwk.getPublicKey(), null);
DecodedJWT jwt = JWT.decode(token);
// check JWT is valid
algorithm.verify(jwt);
}
程式設計師的修養,多看好的開源框架,多思考與總結。