6

मैं अपने आवेदन के लिए OAuth2 का उपयोग करने पर विचार कर रहा हूं। वास्तुकला मैं लागू करने के लिए कोशिश कर रहा हूँ इस प्रकार है:स्प्रिंग बूट ओएथ 2 सिंगल साइन ऑफ (लॉगआउट)

  • मैं अपने खुद के (और केवल इसी) प्राधिकरण सर्वर होगा
  • कुछ संसाधन ऐप्स को अपनी संसाधनों के उपयोग को मान्य प्राधिकरण सर्वर
  • कुछ क्लाइंट का उपयोग ऐप्स (वेब, मोबाइल) जो प्रमाणीकरण के लिए उपयोगकर्ता को प्राधिकरण सर्वर पर रीडायरेक्ट करेगा और सफलता पर एपीआई संसाधन ऐप्स पर उपभोग करेगा।

अब तक मैंने 3 मूल ऐप्स (1 ऑथ सर्वर, 1 संसाधन सर्वर और 1 क्लाइंट) के बीच इस बातचीत को लागू करने में कामयाब रहे हैं। जिस चीज को मैं काम नहीं कर रहा हूं वह लॉगआउट कार्यक्षमता है। मैंने "notoriously tricky problem" पढ़ा है कि डेव सीयर अपने ट्यूटोरियल में वर्णन करता है, लेकिन इस मामले में मुझे लॉग आउट करने के बाद उपयोगकर्ता को पुनः लॉगिन करने की ज़रूरत है। मैंने एक्सेस टोकन और रीफ्रेश टोकन में कुछ सेकंड देने का प्रयास किया है, लेकिन समाप्ति के समय फिर से लॉगिन करने के लिए कहा जा रहा है, मुझे क्लाइंट ऐप पर एनपीई मिल रहा है। मैंने टोकन स्टोर से टोकन को हटाने के लिए इस post में प्रस्तावित समाधानों का भी प्रयास किया है, लेकिन यह काम नहीं करता है। एकल कार्यान्वयन मेरे लिए इस कार्यान्वयन के लिए वांछनीय व्यवहार है। स्प्रिंग बूट Oauth2 का उपयोग करके मैं इसे कैसे प्राप्त कर सकता हूं। यदि किसी कारण से यह संभव नहीं है, तो वसंत बूट का उपयोग करके केंद्रीकृत सुरक्षा को लागू करने के लिए मैं कौन से विकल्प उपयोग कर सकता हूं?

अग्रिम धन्यवाद।

उत्तर

7

के बाद परीक्षण मैंने महसूस किया है कि यह AuthServer को एक रीडायरेक्ट के साथ सिर्फ हल किया जा सकता है और इस तरह प्रोग्राम के रूप में लॉगआउट कर के एक बहुत:

  • ग्राहक एप्लिकेशन में (WebSecurityConfigurerAdapter):

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
        http 
          .logout() 
          .logoutSuccessUrl("http://your-auth-server/exit"); 
    } 
    
  • प्राधिकरण सर्वर में:

    @Controller 
    public class LogoutController { 
    
        @RequestMapping("/exit") 
        public void exit(HttpServletRequest request, HttpServletResponse response) { 
         // token can be revoked here if needed 
         new SecurityContextLogoutHandler().logout(request, null, null); 
         try { 
          //sending back to client app 
          response.sendRedirect(request.getHeader("referer")); 
         } catch (IOException e) { 
          e.printStackTrace(); 
         } 
        } 
    } 
    

मैंने इस कार्यान्वयन के पूर्ण उदाहरण के साथ sample app on github पोस्ट किया है।

+1

इस सरल उत्तर ने मुझे एक सरल समाधान का नेतृत्व किया। –

+0

यह कोड क्या कर रहा है? क्लाइंट ऐप (वेबसाइट) से लॉग आउट करना उपयोगकर्ता को एक प्राधिकरण सर्वर से लॉग आउट करता है? क्या इसका मतलब यह है कि जब उपयोगकर्ता एकाधिक क्लाइंट ऐप में लॉग इन होता है, तो उनमें से किसी एक से लॉग आउट करने से सभी क्लाइंट ऐप से लॉग आउट हो जाता है? – eugene

+0

@ यूजीन मैंने 2 क्लाइंट ऐप्स का उपयोग करके इस समाधान का परीक्षण किया है और जब से किसी से लॉग आउट करना दूसरे को प्रभावित नहीं करता है। यह समाधान क्या करता है कि जब आप लॉगआउट पर क्लिक करते हैं और फिर लॉगिन पर क्लिक करते हैं तो आपको अपने क्रेडेंशियल्स को दोबारा दर्ज करना होगा। ["कुख्यात मुश्किल समस्या"] को हल करने का विकल्प है (https://spring.io/blog/2015/02/03/sso-with-oauth2-angular-js-and-spring-security-part-v# -लॉगआउट-अनुभव)। –

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