2016-03-22 10 views
2

OAuth2プロバイダのトークンリクエストを強化したいと考えています。 POSTリクエストに追加のパラメータを追加する必要があります。私はこれを達成するためにSpring Bootフレームワークをどこに突きつけるべきか理解していません。Spring Boot AccessTokenProviderをカスタマイズするにはどうすればよいですか?

Springブートフレームワークは、「Customizing the User Info RestTemplate」で説明されているように、OAuth2RestTemplateをカスタマイズするためのフックを提供します。私はインスタンス化され、期待どおりに呼び出される次のカスタマイザを実装しました。残念ながら、私のプロバイダは、トークン要求が行われたときに呼び出されないようです。

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(); 
    } 
} 

QUESTION:カスタムAccessTokeProvderを設定し、またはより良い、デフォルト1への参照を取得し、迎撃やエンハンサーとのリクエストにフックどのよう

以下フォークのコードサンプル

、/簡単なモジュールを参照してください。

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

NOTES:/simple/src/main/resources/application.ymlファイルにあなたのAADのテナント情報を追加

  • This commitフレームワークには、これを可能にするようですこの機能をどのように活用するのでしょうか?

  • This questionが関連しているようです。どういうわけか、フェラはカスタムプロバイダを追加しました。しかしここで?

+0

最小限のサンプルプロジェクトはありますか?上記のコードスニペットの 'AadAccessTokenProvider'がなぜ使われないのかは分かりません。 –

+0

「コードサンプル」を参照してください。 – Brett

答えて

0

回避策として、設定ファイルにリソースを追加し、OAuth2RestTemplateを取得してリクエストエンハンサーを追加するために、次の2つのクラスを追加しました。

application.yaml:私は同じ問題に出くわしたし、この回避策を使用しますが、このため、私は春のブート1.3.8で立ち往生

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); 
     } 
    } 
} 
1

私はもっと深く掘り起こし始めました。より簡単な方法を内在的に発見しました。 userAuthorizationUriの後にリソースパラメータを追加するだけです。

security: 
    oauth2: 
    client: 
     ... 
     userAuthorizationUri: https://login.microsoftonline.com/<<tenantId>>/oauth2/authorize?resource=https://graph.windows.net 
     ... 
関連する問題