2014-12-10 4 views
5

मैं वसंत सुरक्षा Oauth2 में बस एक शुरुआत कर रहा हूं। मैं प्राधिकरण सर्वर और संसाधन सर्वर (अलग और जेडीबीसी से कनेक्ट) बनाने का प्रयास करता हूं और इसका उद्देश्य एकल साइन-ऑन करना है। प्रमाणीकरण सर्वर से accesstoken और refreshtoken पाने के लिए मेरी प्रवाह सफलता। मेरा accesstoken हमेशा Resouce सर्वर तक पहुंचने के लिए पैरामीटर के रूप में उपयोग किया जाता है, और यह एक प्रतिक्रिया वापस दे रहा है।वसंत सुरक्षा Oauth2: समाप्त हो चुके हैंडलिंग को संभालने के लिए प्रवाह

for example http://127.0.0.1:8080/Resource/res/staff?access_token=xxxxxxxxxxxxxxxxxxxxx 

मेरी समस्या, अगर accesstoken समाप्त हो गया है, वसंत सुरक्षा पृष्ठ तक पहुंचने और त्रुटि अपवाद देने से रोक देगा। जब मुझे नया टोकन प्राप्त करने के लिए रीफ्रेशटोकन का उपयोग करना चाहिए? या मेरा प्रवाह गलत है? क्या accesstoken नवीकरण करने के लिए कोई अन्य प्रवाह है?

धन्यवाद

संपादित:

FYI करें: मैं वसंत सुरक्षा OAuth2 को उपयोग करने एसएसओ बनाना चाहते हैं। मेरे पास कई ऐप्स सर्वर हैं (स्प्रिंग फ्रेमवर्क का उपयोग करें) और मैं एक सर्वर बनाना चाहता हूं जो लॉगिन प्रबंधित करने के लिए ज़िम्मेदार है। और मैं ऐप सर्वर को संसाधन सर्वर (क्लाइंट भी) बनना चाहता हूं तो मैं वसंत सुरक्षा Oauth2 के साथ एक प्राधिकरण सर्वर बना देता हूं। उपयोगकर्ता जो संरक्षित संसाधन सर्वर तक पहुंचना चाहता है उसे प्राधिकरण सर्वर (संसाधन सर्वर प्राधिकरण सर्वर को अधिकृत) में लॉगिन करना होगा। इसे एक कोड मिलेगा और फिर संसाधन सर्वर इस कोड को एक्सेस टोकन और रीफ्रेश टोकन के साथ एक्सचेंज करेगा। यह प्रवाह सफलता है।

मैं प्रमाणीकरण सर्वर द्वारा दिए गए रीफ्रेश टोकन का उपयोग करके नई पहुंच टोकन का भी अनुरोध कर सकता हूं। लेकिन मैं इस प्रक्रिया को कॉल नहीं कर सकता क्योंकि अगर मैं यूआरएल मानचित्रण तक पहुंचता हूं, तो पहले वसंत सुरक्षा पहुंच को अवरुद्ध कर रही थी और अमान्य टोकन त्रुटि रिटर्न दे रही थी।

मैं लापता लिंक को कैसे हल कर सकता हूं?

अपडेट किया गया:

यह मेरा प्राधिकरण सर्वर विन्यास है:

@Configuration 
public class Oauth2AuthorizationServer { 

@Configuration 
@EnableAuthorizationServer 
protected static class AuthorizationServerConfiguration extends 
     AuthorizationServerConfigurerAdapter { 

    @Autowired 
    @Qualifier("authenticationManagerBean") 
    private AuthenticationManager authenticationManager; 

    @Autowired 
    DataSource dataSource; 


    @Override 
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) 
      throws Exception { 
     endpoints 
       .tokenStore(new JdbcTokenStore(dataSource)) 
       .authenticationManager(authenticationManager); 
    } 

    @Override 
    public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception { 
     oauthServer.tokenKeyAccess("isAnonymous() || permitAll()").checkTokenAccess("permitAll()"); 
    } 

    @Override 
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception { 
     clients 
       .jdbc(dataSource); 
    } 
} 
} 

और ये मेरे संसाधन सर्वर विन्यास (क्लाइंट के रूप में भी) (भी है

@Configuration 
public class Oauth2ResourceServer { 

private static final String RESOURCE_ID = "test"; 

@Configuration @Order(10) 
protected static class NonOauthResources extends WebSecurityConfigurerAdapter { 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http.authorizeRequests() 
       .antMatchers("/api/halo").permitAll() 
       .antMatchers("/api/state/**").permitAll() 
       .antMatchers("/**").permitAll() 
       .and().anonymous(); 
    } 
} 

@Configuration 
@EnableResourceServer 
protected static class ResourceServerConfiguration extends 
     ResourceServerConfigurerAdapter { 

    @Override 
    public void configure(ResourceServerSecurityConfigurer resources) { 
     RemoteTokenServices tokenService = new RemoteTokenServices(); 
     tokenService.setClientId("jsclient"); 
     tokenService.setClientSecret("jspasswd"); 
     tokenService.setCheckTokenEndpointUrl("http://localhost:8084/Server2Auth/oauth/check_token"); 

     resources 
       .resourceId(RESOURCE_ID) 
       .tokenServices(tokenService); 
    } 

    @Override 
    public void configure(HttpSecurity http) throws Exception { 
     http.authorizeRequests() 
       .filterSecurityInterceptorOncePerRequest(true) 
       .antMatchers("/res/staff").hasRole("STAFF") 
       .antMatchers("/res/client").access("#oauth2.hasScope('trust')") 
       .antMatchers("/res/admin").hasRole("ADMIN") 
       .and() 
       .exceptionHandling().accessDeniedPage("/403"); 
    } 

} 

} 

संसाधन ग्राहक के रूप में) अधिकृत करने का अनुरोध:

अधिकृत सर्वर से

प्रतिक्रिया:

http://localhost:10001/resource-server/api/state/new?code=8OppiR 

संसाधन (क्लाइंट) को प्राधिकृत करना कोड का आदान-प्रदान सर्वर: अधिकृत सर्वर से

curl -X POST -vu clientauthcode:123456 http://localhost:10000/auth-server/oauth/token -H "Accept: application/json" -d "grant_type=authorization_code&code=iMAtdP&redirect_uri=http://localhost:10001/resource-server/api/state/new" 

प्रतिक्रिया:

{ 
    "access_token":"08664d93-41e3-473c-b5d2-f2b30afe7053", 
    "token_type":"bearer", 
    "refresh_token":"436761f1-2f26-412b-ab0f-bbf2cd7459c4", 
    "expires_in":43199, 
    "scope":"write read" 
} 

संसाधन (के रूप में ग्राहक) यूआरएल स्वयं

तक पहुंचें ताज़ा का उपयोग कर
curl http://localhost:10001/resource-server/api/admin?access_token=08664d93-41e3-473c-b5d2-f2b30afe7053 

का अनुरोध नई पहुंच toke टोकन

curl -X POST -vu clientauthcode:123456 http://localhost:10000/auth-server/oauth/token -d "client_id=clientauthcode&grant_type=refresh_token&refresh_token=436761f1-2f26-412b-ab0f-bbf2cd7459c4" 
+1

असंबद्ध टिप्पणी: आपको एक शीर्षलेख में पहुंच टोकन रखना चाहिए (यह एक यूआरआई क्वेरी पैरामीटर के रूप में सुरक्षित नहीं है)। –

+1

एक और असंबंधित टिप्पणी: आपको टोकन कुंजी एंडपॉइंट की आवश्यकता नहीं है, इसलिए इसे स्पर्श न करें; और चेक टोकन एंडपॉइंट को उत्पादन सर्वर में 'permitAll() 'के साथ प्रकट नहीं किया जाना चाहिए (' प्रमाणीकृत() 'कोशिश करें)। –

+1

कुछ हद तक संबंधित टिप्पणी (क्योंकि यह सवाल भ्रामक बनाता है) आप यहां कोई एसएसओ नहीं कर रहे हैं। यह संसाधन सर्वर में टोकन-आधारित सुरक्षा के साथ क्लासिक ऑथ/संसाधन सर्वर है। –

उत्तर

2

The OAuth2 Spec पहुंच टोकन ताज़ा पर एक अनुभाग है। इसे स्प्रिंग ओएथ में एक सुंदर मानक तरीके से कार्यान्वित किया गया है (आप केवल ताज़ा टोकन को/टोकन एंडपॉइंट पर पोस्ट करते हैं)।

एसएसओ के लिए बीटीडब्ल्यू आपको आमतौर पर संसाधन सर्वर की आवश्यकता नहीं होती है। लेकिन यह एक अलग सवाल है।

+0

कोई समस्या नहीं। मदद करने के लिए खुश। अगर मेरा जवाब सहायक था, तो कृपया इसे स्वीकार करें ताकि अन्य लोग जान सकें कि इससे उनकी मदद हो सकती है। –

+0

क्षमा करें, मैं ओउथ 2 में भी शुरुआत कर रहा हूं। Ouath2 spec में "प्राधिकरण सर्वर एक नया ताज़ा टोकन जारी कर सकता है", कैसे स्प्रिंग सुरक्षा Oauth2 समस्या दे सकता है? मैं ताज़ा करने के साथ नए accesstoken प्राप्त करने का अनुरोध कर सकता हूं, लेकिन मुझे केवल इतना पता था कि जब कुछ संसाधनों तक पहुंचने के लिए उपयोग किया जाता है तो accesstoken समाप्त हो गया। एफवाईआई मेरा एसएसओ अलग प्राधिकरण और संसाधन सर्वर अलग है क्योंकि इससे पहले मेरे पास कई संसाधन सर्वर हैं, इसलिए मुझे लगता है कि मैं अपने संसाधनों से अलग प्रमाणीकरण सर्वर को अलग कर सकता हूं। – ericagon

+0

एक स्प्रिंग ऑथ सर्वर समस्याएं टोकन रीफ्रेश करते हैं यदि आप उन्हें सक्षम करते हैं (यह डिफ़ॉल्ट नहीं हो सकता है, मैं भूल जाता हूं)। जब एक्सेस टोकन जारी किया जाता है तो ग्राहक लगभग समाप्त होने पर जानता है, इसलिए यह उस जानकारी का उपयोग कर सकता है या केवल 401 के लिए प्रतीक्षा कर सकता है। –

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