2016-03-22 11 views
2

Ich möchte die Token-Anfrage für meinen OAuth2-Provider erweitern. Ich muss der POST-Anfrage einen zusätzlichen Parameter hinzufügen. Ich verstehe nicht, wo ich mich in das Spring Boot-Framework einklinken muss, um dies zu erreichen.Wie kann ich den Spring Boot AccessTokenProvider anpassen?

Das Spring Boot-Framework bietet einen Haken zum Anpassen des OAuth2RestTemplate wie in "Customizing the User Info RestTemplate" beschrieben. Ich habe den folgenden Customizer implementiert, der instanziiert und wie erwartet aufgerufen wird. Leider scheint mein Provider nicht angerufen zu werden, wenn die Token-Anfrage gemacht wird.

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

FRAGT:

Wie ein benutzerdefinierten AccessTokeProvder gesetzt hat, oder noch besser, einen Verweis auf die eine Standard erhalten und mit einem Abfangjäger oder Enhancer in die Anforderungs Haken?

CODE SAMPLE

In der Gabel unten finden Sie in der/einfaches Modul zu sehen. Fügen Sie Ihre AAD Mieter info in die /simple/src/main/resources/application.yml Datei:

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

NOTES:

  • This commit auf Rahmen scheint dies möglich zu machen, Aber wie nutzt man diese Funktionalität?

  • This question scheint verwandt zu sein. Irgendwie hat der Typ einen benutzerdefinierten Anbieter hinzugefügt. Aber wo?

+0

Haben Sie ein minimales Beispielprojekt? Es ist schwer zu verstehen, warum der 'AadAccessTokenProvider' im obigen Code-Snippet nicht verwendet wird. –

+0

Siehe Abschnitt "Codebeispiel". – Brett

Antwort

0

Als Abhilfe können habe ich die Ressource meine Config-Datei und hinzugefügt, um die folgenden zwei Klassen die OAuth2RestTemplate zu erfassen und Anfrage Verstärker hinzufügen.

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

ich mit dem gleichen Problem gegenüber kam und verwendet, um dieses Problem zu umgehen, aber wegen dieses ich mit Federverschluß stecken 1.3.8

Also begann ich tiefer zu graben und dann ich f fand ursprünglich eine einfachere Methode. Fügen Sie einfach einen Ressourcenparameter nach userAuthorizationUri hinzu.

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