簡體   English   中英

在 REST 微服務上使用 Zuul Proxy、Oauth2 實現身份驗證和授權

[英]Implementing authentication and authorization using Zuul Proxy, Oauth2 on REST Microservices

微服務架構

我正在嘗試使用 Spring Boot 在工作流中實現上述架構。

  • Web 客戶端通過 Zuul 代理向資源服務器(微服務端點)發出請求。
  • Zuul 代理重定向到 oauth2 服務器進行身份驗證。
  • 無論請求是否通過身份驗證,Oauth2 都會重定向到 Zuul 代理。
  • 如果未通過身份驗證,Zuul 將使用未經身份驗證的響應重定向 Web 客戶端。
  • 如果已通過身份驗證,Zull 代理將重定向到請求的微服務端點。
  • 微服務端點檢查用戶是否被授權(用戶級別訪問)訪問資源。
  • 微服務還可以對其他微服務進行內部休息調用。
  • 最后,請求的資源被發送回客戶端。

我想確保我遵循正確的工作流程。

我想知道是否有任何解決方案實現了類似的用於保護微服務 API 的解決方案。

我有以下困惑:

  • 我們如何將用戶詳細信息傳遞給微服務,以便微服務可以做自己級別的用戶授權?
  • 是否應該將 OAuth2 訪問令牌標頭傳遞給每個微服務,以便微服務可以單獨驗證令牌?
  • 每個微服務是否應該使用秘密憑證來驗證訪問令牌,以便無法在請求鏈上偽造令牌?

我知道這是一個有點冗長的問題。 但是我還沒有找到上述架構的合適解決方案。

不幸的是,我沒有完整的答案,只有一些部分:

一旦 JWT 令牌可用於 zuul 代理,那么每個微服務都可以通過配置其資源服務器來授權請求​​,例如

 @Override
  public void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests().anyRequest().access("#oauth2.hasScope('microserviceA.read')").and()
        .csrf().disable()
        .httpBasic().disable();
  }

范圍可以由帶有數據庫的 oauth 微服務管理 - 基於客戶端憑據,它將獲取范圍信息並編碼為 JWT 令牌。

我目前不知道的是 - 如何讓 zuul 代理使用“Web 客戶端”憑據來通過 oauth 對其進行授權 - 我不想硬編碼 zuul 代理憑據,因為這樣 Web 客戶端憑據就贏了不會被利用。

我剛剛發布了關於這個主題的類似問題: Authorizing requests through spring gateway with zool via oauth server

更新:我發現文章描述了幾乎這種配置(沒有尤里卡,但從我的經驗來看,它並沒有增加太多復雜性): https : //www.baeldung.com/spring-security-zuul-oauth-jwt ,那里是帶有源代碼的github項目。 不幸的是,源代碼沒有被完善,因為它被作者用於他的商業課程。 但是我已經設法從他的示例工作集構建。

總結:在所描述的架構中,每個資源服務器(微服務 A、B、..)從請求客戶端接收由 zuul 代理/網關轉發的 JWT 令牌。 令牌在請求標頭中轉發。 如果沒有提供有效的令牌,則網關會將請求重定向到授權頁面。 此外,每個資源服務器都可以使用 oauth 服務檢查令牌,如果需要,可以像我上面寫的那樣進行范圍檢查。

我一直在努力解決基於 Spring Cloud 解決方案的微服務架構的相同安全設計問題。 我只發現這篇文章對它有所了解: https : //developer.okta.com/blog/2018/02/13/secure-spring-microservices-with-oauth

但它與 Okta sso 服務提供商有關,而不是其他 oauth2 服務器(如 keycloak)的通用解決方案。

我還看到了一些關於如何使用 oauth2 服務器保護網關和微服務的解決方案,如下所示: https : //github.com/jgrandja/oauth2login-gateway

但它沒有考慮到 Web 客戶端。

我不確定您是否能夠解決這個問題,我可以看到這還沒有得到解答,但是有一種方法可以將所有信息從 JWT 傳遞到所有下游微服務。 編寫您自己的 ZuulAuthenticationFilter,然后創建以下方法

private void addClaimHeaders(RequestContext context, String token) {
    
    try {
        
        Map<String, Claim> claims = jwtTokenVerifier.getAllClaims(token);
        claims.forEach((key, claim) -> {
            
            context.addZuulRequestHeader("x-user-info-"+key, String.valueOf(claim.as(Object.class)));
        });
        
    }catch(Exception ex) {
        
        log.error("Error in setting zuul header : "+ex.getMessage(), ex);
    }
}

這樣,您將在每個微服務的標頭中從 JWT 獲取信息,以“x-user-info-”開頭的標頭將包含您的 JWT 詳細信息

在以下鏈接中有上述架構的實現: https : //www.baeldung.com/spring-security-zuul-oauth-jwt

暫無
暫無

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

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