2017-06-27 17 views
1

私はWebアプリケーションで(jwtトークンを使用して)認証するためにSpringセキュリティとSpring oauthを使用しています。これは正常に動作し、トークンが交換され、正しくログインできます。しかし、一度ログインすると、トークンがあっても認証は失効しません。リソースサーバーからリソースを取得するためにトークンを再利用しようとすると、トークンが有効でなくなったためアクセスが拒否されます。春のセキュリティトークンが有効でなくなったときにOAuth認証が有効期限切れにならない

私のウェブアプリケーションはステートフル(vaadin)ウェブアプリケーションです。それは、たくさんのもののためにセッションを使用して、私はそれを回避することはできません。 OAuthを使用した認証後、認証されたかどうかを確認するために "以前に認証されたorg.springframework.security.oauth2.provider.OAuth2Authentication"が使用されます。セッションが破棄されるまで、これはちょうど "真"になります。

私の残りのAPIは状態/セッションなしであり、毎回トークンを正しく検証します。有効期限が切れていれば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経由でチェックトークンエンドポイントを使用しました –

答えて

0

jwtの代わりにデフォルトのトークンを使用し、認証サーバーのtokencheckエンドポイントを使用して確認しました。このようにして、すべての要求に対して検証されます。

+0

私はすべての情報を持っているのでリモートチェックサービスを呼び出す必要がありますトークンの有効性について...何が間違っているのか分かりません – Seb

+0

JWTを使用する場合のみ、私はもうしません。トークンは基本的にランダムな文字列であり、repoに対してチェックされます(remotetokenrepositoryとchecktokenエンドポイントを使用して) –

0

この問題の回避策は、アクセストークンが期限切れになっているかどうかをチェックし、401応答を送信するフィルタを追加することで解決しました。この応答はUI側で処理され、ユーザーはセッションを更新するように求められます。セッションがリフレッシュされると、アクセストークンもリフレッシュされます。ソリューションはJWTで動作します。

コード:

@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 */ 
} 
関連する問題