簡體   English   中英

將 Spring 安全性與 AWS Cognito 集成

[英]Integrating Spring Security with AWS Cognito

我正在為在 Spring Boot 項目中使用 AWS Cognito 的系統構建后端。 對於我的一些 API 請求,我希望使用客戶端通過 AWS Cognito 用戶的 JWT 傳遞的不記名令牌對它們進行身份驗證。

我有以下 class 來驗證和解析它:

public class Auth {
    record CanonicalAuthToken(String token, UUID uuid, String username) {}

    public static Optional<CanonicalAuthToken> validateAndExtractToken(String token, String jwksUrl, String jwtTokenIssuer) {
        var decodedJwtToken = JWT.decode(token);
        var kid = decodedJwtToken.getKeyId();

        try {

            var http = new UrlJwkProvider(new URL(jwksUrl));
            // Let's cache the result from Cognito for the default of 10 hours
            var provider = new GuavaCachedJwkProvider(http);

            var jwk = provider.get(kid);

            var algorithm = com.auth0.jwt.algorithms.Algorithm.RSA256((RSAPublicKey) jwk.getPublicKey(), null);
            var verifier = JWT.require(algorithm)
                    .withIssuer(jwtTokenIssuer)
                    .build();

            var decoded = verifier.verify(token);

            return Optional.of(new CanonicalAuthToken(decoded.getToken(), UUID.fromString(decoded.getSubject()), decoded.getClaim("username").asString()));
        } catch (Exception e) {
            e.printStackTrace();
        }

        return Optional.empty();
    }

    private Auth() {}
}

但是,這僅在每個端點實現的主體中手動調用它時才有效。 相反,我想利用 Spring 的內置安全機制充當身份驗證的中間件。

我確實找到了幾個解決方案,所有這些解決方案都包含大約六個類。 但是,這些都不允許我在端點實現本身中實際訪問解碼后的 JWT(具體來說,我想訪問sub字段,以便我可以訪問用戶的 UUID 並在數據庫中匹配它)。

到目前為止,我能夠找到的所有資源都有些相關和有用,但是我仍然找不到實現這一特定目標的方法,而且我什至不確定要谷歌什么。

任何幫助表示贊賞,謝謝!

您應該配置 Filter 並從 FE 發送 header 中的令牌。 一旦你在過濾器中有了令牌,你就可以解析和驗證

 @Override
    public void doFilter(
      ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        String token = request.getHeader("Authorization");
        // validate and parse token
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;
        LOG.info(
          "Logging Request  {} : {}", req.getMethod(), 
          req.getRequestURI());
        chain.doFilter(request, response);
        LOG.info(
          "Logging Response :{}", 
          res.getContentType());
    }

https://www.baeldung.com/spring-boot-add-filter

https://www.baeldung.com/spring-security-custom-filter

https://spring.io/guides/topicals/spring-security-architecture

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM