27

मैं स्प्रिंग बूट + स्प्रिंग सिक्योरिटी ओएथ 2 एप्लिकेशन के साथ काम कर रहा हूं जो मुझे विश्वास है कि डेव सीयर के उदाहरणों से प्रेरित थे। संसाधन को मालिक स्वामी पासवर्ड प्रमाण-पत्र प्रवाह का उपयोग कर एक एकल क्लाइंट के साथ, OAuth2 प्रमाणीकरण सर्वर के रूप में कॉन्फ़िगर किया गया है। एक सफल टोकन जेडब्ल्यूटी होने के लिए कॉन्फ़िगर किया गया है।स्प्रिंग सिक्योरिटी ओएथ 2 और स्प्रिंग सोशल को एकीकृत करें

सार्वजनिक कोणीय ग्राहक एक पोस्ट अनुरोध भेजता/OAuth/क्लाइंट ID और सीक्रेट (यह सबसे आसान तरीका है ग्राहक को प्रमाणित करने के मिल गया था, भले ही गुप्त निजी नहीं है) से युक्त एक मूल प्रमाणीकरण हेडर के साथ टोकन के लिए। अनुरोध के निकाय में उपयोगकर्ता नाम, पासवर्ड और अनुदान प्रकार "पासवर्ड" होता है।

प्रमाणीकरण सर्वर होने के अतिरिक्त, एप्लिकेशन उपयोगकर्ताओं, टीमों और संगठनों के लिए एक विश्वसनीय संसाधन सर्वर है।

मैं स्प्रिंग सोशल का उपयोग कर एक अतिरिक्त एसएसओ प्रमाणीकरण प्रवाह जोड़ने की कोशिश कर रहा हूं। मुझे स्प्रिंग सोशल को बाहरी प्रदाताओं के माध्यम से/auth/[प्रदाता] के माध्यम से प्रमाणित करने के लिए कॉन्फ़िगर किया गया है; हालांकि, निम्नलिखित अनुरोधों के पास सुरक्षा कॉन्टेक्स्ट सही ढंग से सेट नहीं है। संभवतः, स्प्रिंग सिक्योरिटी ओएथ सर्वर या क्लाइंट सुरक्षा कॉन्टेक्स्ट को ओवरराइड कर रहा है?

यदि मैं स्प्रिंग सोशल फ्लो के बाद सुरक्षा कॉन्टेक्स्ट सही ढंग से सेट कर सकता हूं, तो मुझे एक नया टोकनग्रेनर मिला है जो एक नए अनुदान प्रकार "सामाजिक" की अनुमति देता है जो पूर्व प्रमाणीकृत उपयोगकर्ता के लिए सुरक्षा कॉन्टेक्स्टहोल्डर की जांच करेगा।

मुझे सुरक्षा कॉन्टेक्स्ट (मुझे विश्वास है कि यह स्प्रिंग ओएथ + सोशल एकीकरण के साथ एक मुद्दा है), या बाहरी प्रदाताओं के साथ प्रमाणीकरण के लिए एक अलग दृष्टिकोण और हमारे स्वयं से वैध जेडब्ल्यूटी प्राप्त करने के लिए एक अलग दृष्टिकोण के समाधान में दिलचस्पी है। ऑथ सर्वर।

धन्यवाद!

+0

क्या आपके पास कोई भी कोड साझा हो सकता है? जो आप वर्णन कर रहे हैं वह सेट अप करने में एक चुनौती है, इसलिए यदि संभवतः हमारे लिए इस तरह का एक उदाहरण बनाने के बजाय हमारे लिए शुरू करने के लिए कुछ तैयार करने के लिए कोड तैयार करने के लिए हम संभवतः आपके लिए एक उत्तर खोज सकते हैं । –

उत्तर

3

सबसे पहले, मैं आपको इस तरह के उपयोग मामले के लिए पासवर्ड अनुदान से दूर जाने की दृढ़ता से अनुशंसा करता हूं।
सार्वजनिक क्लाइंट (जावास्क्रिप्ट, स्थापित अनुप्रयोग) अपने क्लाइंट को गोपनीय गोपनीय नहीं रख सकते हैं, यही कारण है कि उन्हें एक असाइन नहीं किया जाना चाहिए: आपके जावास्क्रिप्ट कोड का निरीक्षण करने वाला कोई भी विज़िटर गुप्त खोज सकता है, और इस प्रकार आपके पास एक ही प्रमाणीकरण पृष्ठ को लागू कर सकता है, जो आपके उपयोगकर्ताओं को संग्रहीत करता है प्रक्रिया में पासवर्ड।

अंतर्निहित अनुदान आपके द्वारा किए जा रहे कार्यों के लिए बिल्कुल बनाया गया है।
एक पुनर्निर्देशन-आधारित प्रवाह का उपयोग प्राधिकरण सर्वर तक प्रमाणीकरण तंत्र को छोड़ने का लाभ होता है, इसके बजाय आपके प्रत्येक एप्लिकेशन में इसका एक टुकड़ा होता है: यह ज्यादातर एकल साइन ऑन (एसएसओ) की परिभाषा है।

इसके साथ ही कहा, आपके सवाल कसकर इस एक मैं सिर्फ जवाब से संबंधित है: Own Spring OAuth2 server together with 3rdparty OAuth providers

जवाब सारांश में:

अंत में, यह कैसे अपने प्राधिकरण सर्वर को सुरक्षित AuthorizationEndpoint के बारे में है :/ओथ/अधिकृत करें। चूंकि आपका प्राधिकरण सर्वर काम करता है, आपके पास पहले से ही एक कॉन्फ़िगरेशन क्लास है जो WebSecurityConfigurerAdapter को विस्तारित करता है जो/lauthin के साथ/oauth/प्राधिकरण के लिए सुरक्षा को संभालता है। यही वह जगह है जहां आपको सामाजिक सामान को एकीकृत करने की आवश्यकता है।

आप जो भी हासिल करने का प्रयास कर रहे हैं उसके लिए आप बस एक पासवर्ड अनुदान का उपयोग नहीं कर सकते हैं, तो आपके पास अपने सार्वजनिक क्लाइंट प्राधिकरण सर्वर पर रीडायरेक्ट होना चाहिए।प्राधिकरण सर्वर /oauth/authorize एंडपॉइंट के लिए इसके सुरक्षा तंत्र के रूप में सामाजिक लॉगिन पर रीडायरेक्ट करेगा।

+1

मैं इस वार्तालाप में भाग लेना चाहता हूं। मैं हार गया हूं। मेरे पास अलग-अलग कस्टम प्रमाणीकरण सर्वर भी हैं लेकिन यह समझ में नहीं आता कि कैसे मेरे वेब सेक्योरिटी कॉन्फ़िगरर एडाप्टर में 'सामाजिक कर्मचारियों को एकीकृत करें'। मैं सोशल प्लेटफॉर्म के साथ प्रमाणीकरण के बारे में सोच रहा हूं और पोस्ट जेनरेटेड चरण में अपने स्वयं के जेडब्ल्यूटी के लिए इस टोकन का आदान-प्रदान कर रहा हूं। धन्यवाद! – maret

+0

@maret क्या आपने सही संसाधन ढूंढने का प्रबंधन किया है जो इसे विस्तार से समझाता है? – zalis

+0

@zalis मैंने कुछ क्लाइंट तर्क की अतिरिक्त सहायता के साथ शुद्ध स्प्रिंग ओएथ 2 के साथ जाने का फैसला किया है, जो सामाजिक टोकन प्राप्त करता है और मेरे प्रमाणीकरण सर्वर के साथ अपने स्वयं के जेडब्ल्यूटी टोकन के लिए इसका आदान-प्रदान करता है। लेकिन इस समाधान के लिए आपको अपने क्लाइंट के लिए कुछ सर्वर पक्ष होना चाहिए। पता नहीं है कि यह मदद करेगा, लेकिन यहां मैंने अपने स्वयं के प्रश्न का उत्तर दिया है (फ़ॉर्मेटिंग के लिए खेद है, इसे ठीक करने के बारे में नहीं पता): http: //stackoverflow.com/questions/41578040/spring-oauth2-support -उथ-एंड-रिसोर्स-एक्सेस-दोनों-एसएसओ-एंड-कस्टम-ऑथ-से – maret

8

मुझे JHipster-जनरेटेड वेब एप्लिकेशन पर एक ही समस्या थी। अंत में मैंने स्प्रिंग सोशल से SocialAuthenticationFilter विकल्प (SpringSocialConfigurer के माध्यम से) के साथ जाने का फैसला किया। एक सफल सामाजिक लॉगिन के बाद, सर्वर स्वचालित रूप से क्लाइंट ऐप को पुनर्निर्देशन के माध्यम से "स्वयं" पहुंच टोकन उत्पन्न करता है और देता है।

@Configuration 
@EnableResourceServer 
protected static class ResourceServerConfiguration extends ResourceServerConfigurerAdapter implements EnvironmentAware { 

    //... 

    @Inject 
    private AuthorizationServerTokenServices authTokenServices; 

    @Override 
    public void configure(HttpSecurity http) throws Exception { 

     SpringSocialConfigurer socialCfg = new SpringSocialConfigurer(); 
     socialCfg 
      .addObjectPostProcessor(new ObjectPostProcessor<SocialAuthenticationFilter>() { 
       @SuppressWarnings("unchecked") 
       public SocialAuthenticationFilter postProcess(SocialAuthenticationFilter filter){ 
        filter.setAuthenticationSuccessHandler(
          new SocialAuthenticationSuccessHandler(
            authTokenServices, 
            YOUR_APP_CLIENT_ID 
          ) 
         ); 
        return filter; 
       } 
      }); 

     http 
      //... lots of other configuration ... 
      .apply(socialCfg); 
    }   
} 

और SocialAuthenticationSuccessHandler वर्ग:

यहाँ मेरी कोशिश है

public class SocialAuthenticationSuccessHandler implements AuthenticationSuccessHandler { 

    public static final String REDIRECT_PATH_BASE = "/#/login"; 
    public static final String FIELD_TOKEN = "access_token"; 
    public static final String FIELD_EXPIRATION_SECS = "expires_in"; 

    private final Logger log = LoggerFactory.getLogger(getClass()); 
    private final AuthorizationServerTokenServices authTokenServices; 
    private final String localClientId; 

    public SocialAuthenticationSuccessHandler(AuthorizationServerTokenServices authTokenServices, String localClientId){ 
     this.authTokenServices = authTokenServices; 
     this.localClientId = localClientId; 
    } 

    @Override 
    public void onAuthenticationSuccess(HttpServletRequest request, 
      HttpServletResponse response, Authentication authentication) 
        throws IOException, ServletException { 
     log.debug("Social user authenticated: " + authentication.getPrincipal() + ", generating and sending local auth"); 
     OAuth2AccessToken oauth2Token = authTokenServices.createAccessToken(convertAuthentication(authentication)); //Automatically checks validity 
     String redirectUrl = new StringBuilder(REDIRECT_PATH_BASE) 
      .append("?").append(FIELD_TOKEN).append("=") 
      .append(encode(oauth2Token.getValue())) 
      .append("&").append(FIELD_EXPIRATION_SECS).append("=") 
      .append(oauth2Token.getExpiresIn()) 
      .toString(); 
     log.debug("Sending redirection to " + redirectUrl); 
     response.sendRedirect(redirectUrl); 
    } 

    private OAuth2Authentication convertAuthentication(Authentication authentication) { 
     OAuth2Request request = new OAuth2Request(null, localClientId, null, true, null, 
       null, null, null, null); 
     return new OAuth2Authentication(request, 
       //Other option: new UsernamePasswordAuthenticationToken(authentication.getPrincipal(), "N/A", authorities) 
       new PreAuthenticatedAuthenticationToken(authentication.getPrincipal(), "N/A") 
       ); 
    } 

    private String encode(String in){ 
     String res = in; 
     try { 
      res = UriUtils.encode(in, GeneralConstants.ENCODING_UTF8); 
     } catch(UnsupportedEncodingException e){ 
      log.error("ERROR: unsupported encoding: " + GeneralConstants.ENCODING_UTF8, e); 
     } 
     return res; 
    } 
} 

इस तरह अपने क्लाइंट ऐप /#/login?access_token=my_access_token&expires_in=seconds_to_expiration करने के लिए, जब तक कि आप सेट के रूप में पुनर्निर्देशन के माध्यम से अपने वेब एप्लिकेशन की पहुँच टोकन प्राप्त होगा संबंधित REDIRECT_PATH_BASESocialAuthenticationSuccessHandler में।

मुझे उम्मीद है कि यह मदद करता है।

+0

वास्तव में 'YOUR_APP_CLIENT_ID' क्या है? स्थिर 'GeneralConstants.ENCODING_UTF8' क्या है? –

+0

'सार्वजनिक स्थैतिक अंतिम स्ट्रिंग ENCODING_UTF8 = "यूटीएफ -8" '। – rbarriuso

+0

मैं 'UserConnectionRepository',' SocialAuthenticationServiceLocator' और 'SocialUserDetailsService'' के लिए बीन्स जोड़ने के बाद अपना ऐप शुरू करने में कामयाब रहा। मुझे इस तरह 'लागू' विधि में भी एक कलाकार जोड़ना पड़ा: '.and() लागू करें ((सुरक्षा कॉन्फ़िगरर <डिफ़ॉल्ट सुरक्षा फ़िल्टर चेन, एचटीपी सुरक्षा]) socialCfg)'। लेकिन अब आप एचटीएमएल से इसका इस्तेमाल कैसे करते हैं? –

0

मैंने अपनी बाकी सेवाओं को सुरक्षित करने के लिए वसंत oauth2 लागू किया और इसके अतिरिक्त पहली बार लॉगिन के लिए सामाजिक लॉगिन और निहित साइनअप जोड़ा। उपयोगकर्ता प्रयोक्ता के लिए आप उपयोगकर्ता नाम और पासवर्ड का उपयोग करके टोकन जेनरेट कर सकते हैं केवल सामाजिक उपयोगकर्ता के लिए टोकन उत्पन्न करने में समस्या। इसके लिए आपको फ़िल्टर को कार्यान्वित करना होगा जो प्रसंस्करण से पहले आपके/ओथ/टोकन अनुरोध को रोक देगा। यहां यदि आप सामाजिक उपयोगकर्ता के लिए टोकन जेनरेट करना चाहते हैं तो उपयोगकर्ता नाम और फेसबुक टोकन पास करें, यहां आप फेसबुक टोकन का पासवर्ड के रूप में उपयोग कर सकते हैं और फेसबुक उपयोगकर्ता के लिए टोकन जेनरेट कर सकते हैं। यदि फेसबुक टोकन अपडेट किया गया है तो आपको उपयोगकर्ता तालिका में टोकन अपडेट करने के लिए एक डीबी ट्रिगर भी लिखना होगा .... हो सकता है कि यह आपकी मदद करेगा

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