簡體   English   中英

如何自定義 Spring Boot AccessTokenProvider?

[英]How do I customize the Spring Boot AccessTokenProvider?

我想增強 OAuth2 提供程序的令牌請求。 我需要向 POST 請求添加一個額外的參數。 我不明白在何處掛鈎 Spring Boot 框架來完成此操作。

Spring Boot 框架提供了一個用於自定義 OAuth2RestTemplate 的鈎子,如“ 自定義用戶信息 RestTemplate ”中所述。 我已經實現了以下定制器,它按預期被實例化和調用。 不幸的是,在發出令牌請求時,我的提供者似乎沒有被調用。

public class AadUserInfoRestTemplateCustomizer implements UserInfoRestTemplateCustomizer {
    @Override
    public void customize(OAuth2RestTemplate oAuth2RestTemplate) {

        oAuth2RestTemplate.setAuthenticator(new AadOauth2RequestAuthenticator());

        // Attempt 1: Use my own token provider, but it never gets called...
        oAuth2RestTemplate.setAccessTokenProvider(new AadAccessTokenProvider());

        // Even better, if only OAuth2RestTemplate provided a getter for AccessTokenProvider, I could add interceptors and or enhancers
        // Can't do this :( AuthorizationCodeAccessTokenProvider provider = oAuth2RestTemplate.getAccessTokenProvider();
    }
}

題:

如何設置自定義 AccessTokeProvder,或者甚至更好,獲取對默認值的引用並使用攔截器或增強器掛鈎請求?

代碼示例

在下面的 fork 中,請查看 /simple 模塊。 將您的 AAD 租戶信息添加到 /simple/src/main/resources/application.yml 文件中:

https://github.com/bmillerbma/tut-spring-boot-oauth2/tree/aad

筆記:

  • 對框架的這種承諾似乎使這成為可能,但是如何利用這一功能呢?

  • 這個問題似乎是相關的。 不知何故,這家伙添加了一個自定義提供程序。 但是哪里?

作為一種解決方法,我將資源添加到我的配置文件中,並添加了以下兩個類來捕獲 OAuth2RestTemplate 並添加請求增強器。

應用程序.yaml:

aad:
  resource: https://graph.windows.net

security:
  oauth2:
    client:
      clientId: [clientid]
etc.

@Component
public class AzureRequestEnhancerCustomizer {
    @Autowired
    private OAuth2RestTemplate userInfoRestTemplate;

    @Autowired
    private AzureRequestEnhancer azureRequestEnhancer;

    @PostConstruct
    public void testWiring() {
        AuthorizationCodeAccessTokenProvider authorizationCodeAccessTokenProvider = new AuthorizationCodeAccessTokenProvider();
        authorizationCodeAccessTokenProvider.setTokenRequestEnhancer(azureRequestEnhancer);
        userInfoRestTemplate.setAccessTokenProvider(authorizationCodeAccessTokenProvider);
    }
}

@Component
public class AzureRequestEnhancer implements RequestEnhancer {
    @Value("${aad.resource:null}")
    private String aadResource;

    @Override
    public void enhance(AccessTokenRequest request, OAuth2ProtectedResourceDetails resource, MultiValueMap<String, String> form, HttpHeaders headers) {
        if (!StringUtils.isEmpty(resource)) {
            form.set("resource", aadResource);
        }
    }
}

我遇到了同樣的問題並使用了這個解決方法,但因此我堅持使用 spring boot 1.3.8

所以我開始深入挖掘,然后我終於找到了一個更簡單的方法。 只需在userAuthorizationUri之后添加一個資源參數。

security:
  oauth2:
    client:
      ...
      userAuthorizationUri: https://login.microsoftonline.com/<<tenantId>>/oauth2/authorize?resource=https://graph.windows.net
      ...

暫無
暫無

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

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