0

有時用戶的本地數據庫中的刷新令牌變舊。爲了補充,我正在嘗試添加prompt=consent param,同時進行oauth2調用。我試圖@Autowire AuthorizationCodeAccessTokenProvider在我的配置類,並在afterPropertiesSet我在做一個setTokenRequestEnhancer,然後意識到,這個bean甚至沒有通過Spring容器初始化,當我在OAuth2RestTemplate動態添加param到oauth2中的userAuthorizationUri

private AccessTokenProvider accessTokenProvider = new AccessTokenProviderChain(Arrays.<AccessTokenProvider> asList( new AuthorizationCodeAccessTokenProvider(), new ImplicitAccessTokenProvider(), new ResourceOwnerPasswordAccessTokenProvider(), new ClientCredentialsAccessTokenProvider()));

搜索如果看了下面的代碼任何春季代碼都會打電話給org.springframework.security.oauth2.client.token.grant.code.AuthorizationCodeAccessTokenProvider.setAuthorizationRequestEnhancer(RequestEnhancer)以瞭解如何訪問它,但沒有人會調用它。

問題:如何在oauth2調用時動態添加一個參數到userAuthorizationUri

回答

1

不幸的是,我還沒有找到一個優雅的解決方案。不過,我注意到,重定向是由UserRedirectRequiredException觸發的。

我能夠通過註冊自定義過濾器來動態添加請求參數,該自定義過濾器可以動態地修改

@Component 
@Order(-102) 
public class EnhanceUserRedirectFilter implements Filter { 

    @Override 
    public void init(final FilterConfig filterConfig) throws ServletException { 
    } 

    @Override 
    public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) throws IOException, ServletException { 
     try { 
      chain.doFilter(request, response); 
     } catch (final UserRedirectRequiredException ex) { 
      ex.getRequestParams().put("prompt", "consent"); 
      throw ex; 
     } 
    } 

    @Override 
    public void destroy() { 
    } 
} 

請注意,這樣的servlet過濾器比Spring Security具有更高的優先級。在我的情況下,-102優先於Spring Security默認值-100