2017-06-27 6 views
1

我使用Spring安全性和彈簧oauth在我的web應用程序中進行身份驗證(使用jwt令牌)。這工作正常,令牌得到交換,我可以正確登錄。但是,即使令牌登錄,身份驗證也不會過期。當我嘗試重新使用令牌從我的資源服務器獲取資源時,它會返回一個拒絕訪問,因爲令牌不再有效。當令牌不再有效時,彈簧安全OAuth身份驗證不會過期

我的web應用程序是一個有狀態(vaadin)web應用程序。它使用會話的東西很多,我無法繞過使用它。使用OAuth進行身份驗證後,它將使用「以前進行身份驗證:org.springframework.security.oauth2.provider.OAuth2Authentication」來檢查它是否已通過身份驗證,並且我認爲這隻會在會話銷燬之前爲「真實」。

我的rest api是state/sessionless,因此每次都會正確驗證令牌。如果它已經過期,它將會提供一個401。

我發現處理這個的唯一方法是相當醜陋的:如果api返回401,會話失效。但是我想看到的是,web應用程序還檢查每個請求上的令牌的有效性。使用會話時有沒有辦法做到這一點?

這是我的webapp的oauth安全配置部分。

@Configuration 
@EnableOAuth2Sso 
public class OAuthConfig extends WebSecurityConfigurerAdapter 
{ 

    @Override 
    protected void configure(HttpSecurity http) throws Exception 
    { 
     http.csrf().disable() 
       .authorizeRequests() 
       .antMatchers("/login**").permitAll() 
       .anyRequest().authenticated() 
       .and() 
       .logout() 
       .logoutSuccessUrl("/") 
       .logoutRequestMatcher(new AntPathRequestMatcher("/logout")) 
       .and() 
       .exceptionHandling().authenticationEntryPoint((request, response, authException) -> response.sendRedirect("/login")); 
    } 

} 
+0

這個問題的任何運氣?似乎不可思議,我們必須手動檢查有效性並刷新令牌 – Seb

+0

我最終放棄了默認的JWT令牌,並通過RemoteTokenRepository使用了檢查令牌endoint –

回答

0

我最終使用默認令牌代替了jwt,並使用auth服務器的tokencheck端點進行檢查。這樣它就可以驗證每個請求。

+0

這聽起來很奇怪,我們必須調用遠程檢查服務,因爲我們擁有所有信息關於令牌的有效性......我無法弄清楚什麼是錯誤的 – Seb

+0

只有當你使用智威湯遜時,我不再這樣做。所以令牌基本上是一個隨機的字符串,它根據repo進行檢查(使用remotetokenrepository和checktoken端點) –

0

我對這個問題的解決方法是通過添加篩選器來解決的,該篩選器檢查訪問令牌是否過期併發送401響應。此響應在UI端進行處理,並要求用戶刷新會話。當會話刷新時,訪問令牌也會刷新。解決方案適用於智威湯遜。

代碼:

@Component 
public class ExpiredTokenFilter implements Filter { 

    @Autowired 
    private OAuth2ClientContext oAuth2ClientContext; 

    @Override 
    public void doFilter(ServletRequest servletRequest...) throws... { 
     OAuth2AccessToken accessToken = oAuth2ClientContext.getAccessToken(); 
     if (accessToken != null && accessToken.isExpired()) { 
      HttpServletResponse httpServletReponse = (HttpServletResponse) servletResponse; 
      httpServletReponse.sendError(401); 
      return; 
     } 
    } 
    /* ... rest of code */ 
} 
相關問題