7

हम एक माइक्रोएस सेवा स्थापित करना चाहते हैं जो एक आरईएसटी एपीआई प्रदान करता है ताकि इसे ओएथ 2 संसाधन सर्वर के रूप में कॉन्फ़िगर किया जा सके। इस सेवा को क्लाइंट क्रेडेंशियल अनुदान के साथ ओएथ 2 क्लाइंट के रूप में भी कार्य करना चाहिए। यहां कॉन्फ़िगरेशन है:स्प्रिंग क्लाउड OAuth2 क्लाइंट ऑटोकॉन्फ़िगरेशन को ओवरराइट कैसे करें?

spring.oauth2.client.id=clientCredentialsResource 
spring.oauth2.client.accessTokenUri=http://localhost:9003/oauth/token 
spring.oauth2.client.userAuthorizationUri=http://localhost:9003/oauth/authorize 
spring.oauth2.client.grantType=client_credentials 
spring.oauth2.client.clientId=<service-id> 
spring.oauth2.client.clientSecret=<service-pw> 

संसाधन सर्वर भाग ठीक काम करता है। ग्राहक भाग के लिए हम बहाना करना, रिबन और यूरेका उपयोग करना चाहते हैं:

@FeignClient("user") 
public interface UserClient 
{ 
    @RequestMapping(method = RequestMethod.GET, value = "/user/{uid}") 
    Map<String, String> getUser(@PathVariable("uid") String uid); 
} 

सार मुद्दा https://github.com/spring-cloud/spring-cloud-security/issues/56 में मैं एक बहाना करना अनुरोध intercepter जो बहाना करना अनुरोध हेडर

में autowired OAuth2RestOperations टेम्पलेट से पहुँच टोकन सेट बनाया के आधार पर
@Autowired 
private OAuth2RestOperations restTemplate; 

template.header(headerName, String.format("%s %s", tokenTypeName, restTemplate.getAccessToken().toString())); 

लेकिन यह मुझे उपयोगकर्ता सेवा को फोन पर त्रुटि देता है:

error="access_denied", error_description="Unable to obtain a new access token for resource 'clientCredentialsResource'. The provider manager is not configured to support it. 

मैं OAuth2ClientAutoConf देख सकते हैं iguration हमेशा वेब अनुप्रयोग के लिए AuthorizationCodeResourceDetails का एक उदाहरण बनाता है लेकिन आवश्यक क्लाइंट क्रेडेंशियल संसाधन संसाधन नहीं जो केवल गैर-वेब अनुप्रयोगों के लिए उपयोग किया जाता है। अंत में कोई पहुँच टोकन privider संसाधन जानकारी के लिए जिम्मेदार है और कॉल में

AccessTokenProviderChain.obtainNewAccessTokenInternal(AccessTokenProviderChain.java:146) 

मैं ऑटो विन्यास ऊपर लिख करने की कोशिश की विफल रही है लेकिन असफल रहे। क्या कोई मुझे संकेत दे सकता है कि इसे कैसे करें?

उत्तर

8

स्वत: कॉन्फ़िगरेशन के इस टुकड़े को बंद करने के लिए आप spring.oauth2.client.clientId= (खाली), (स्रोत कोड प्रति) सेट कर सकते हैं, अन्यथा आपको @EnableAutoConfiguration में इसे "बाहर" करना होगा। यदि आप ऐसा करते हैं तो आप अपना खुद का OAuth2RestTemplate सेट कर सकते हैं और अपनी खुद की कॉन्फ़िगरेशन से "असली" क्लाइंट आईडी भर सकते हैं, उदा।

@Configuration 
@EnableOAuth2Client 
public class MyConfiguration { 

    @Value("myClientId") 
    String myClientId; 

    @Bean 
    @ConfigurationProperties("spring.oauth2.client") 
    @Primary 
    public ClientCredentialsResourceDetails oauth2RemoteResource() { 
    ClientCredentialsResourceDetails details = new ClientCredentialsResourceDetails(); 
    details.setClientId(myClientId); 
    return details; 
    } 

    @Bean 
    public OAuth2ClientContext oauth2ClientContext() { 
    return new DefaultOAuth2ClientContext(new DefaultAccessTokenRequest()); 
    } 

    @Bean 
    @Primary 
    public OAuth2RestTemplate oauth2RestTemplate(
     OAuth2ClientContext oauth2ClientContext, 
     OAuth2ProtectedResourceDetails details) { 
    OAuth2RestTemplate template = new OAuth2RestTemplate(details, 
     oauth2ClientContext); 
    return template; 
    } 

} 
+0

त्वरित उत्तर के लिए धन्यवाद! यह मैंने कोशिश की है। स्वत: कॉन्फ़िगरेशन को छोड़कर काम नहीं करता है क्योंकि ऑटो-वायरिंग निर्भरता विफल रही है। मैंने क्लाइंट को खाली करने के लिए अभी कोशिश की है जो खाली काम करता है, लेकिन किसी कारण से मैं OAuth2RestOperations बाकी ऑटो-वायर नहीं कर सकता हूं, जिससे मैं एक्सेस टोकन प्राप्त करना चाहता हूं। कोई विचार? –

+0

मुझे लगता है कि आपको उस प्रकार का '@ बीन' भी बनाना होगा। मैं जवाब में कोड अपडेट करूंगा। –

+0

दरअसल आपको 'spring.oauth2.client.clientId' को बिल्कुल भी सेट करने की आवश्यकता नहीं हो सकती है (इसे खाली छोड़ने के बजाय)। अगर यह काम करता है तो हमें बताएं। –

संबंधित मुद्दे