2015-01-02 15 views
5

में फेसबुक लॉगिन स्वीकार करें मेरे पास बैकएंड सर्वर (जावा/स्प्रिंग/स्प्रिंग सिक्योरिटी) है। वर्तमान में जब मोबाइल ऐप लॉगिन के उपयोगकर्ता, वे बस अपना उपयोगकर्ता नाम/पासवर्ड जमा करते हैं और स्प्रिंग सिक्योरिटी सत्र बनाता है और इसे JSESSIONID के साथ अनुरोध पर असाइन करता है।मेरे आरईएसटी एपीआई

अब हमारे पास मोबाइल ऐप "फेसबुक के साथ लॉगिन" पर एक बटन भी होगा। यहां मेरी समझ है कि यह कैसे काम करेगा।

  1. मोबाइल एप्लिकेशन प्राप्त करने के लिए फेसबुक एसडीके का उपयोग करता है एक "ACCESS_TOKEN"
  2. मोबाइल एप्लिकेशन है, तो उपयोगकर्ता नाम फेसबुक से उपयोगकर्ता प्रोफ़ाइल (नाम, उपनाम, ईमेल आदि ..)
  3. मोबाइल चेक (अपने सर्वर के खिलाफ) पुनर्प्राप्त अद्वितीय है
  4. उपयोगकर्ता नाम अद्वितीय, कुछ इस तरह से मेरे बाकी एपीआई, फोन/लॉगिन/फेसबुक पोस्ट एसएसएल और ACCESS_TOKEN, ईमेल, उपयोगकर्ता नाम आदि गुजर ...) से अधिक
  5. अपने सर्वर तो जांच करता है कि ACCESS_TOKEN है वैध

    GET graph.facebook.com/debug_token? input_token={token-to-inspect} &access_token={app-token-or-admin-token}

  6. यदि हाँ, अगर यूआईडी फेसबुक द्वारा वापस अपने स्थानीय डेटाबेस में पहले से मौजूद है, मैं इस प्रकार उपयोगकर्ता प्रवेश द्वारा:
SecurityContextHolder.getContext().setAuthentication(
       new UsernamePasswordAuthenticationToken(username, null, ROLE_USER)); 
  1. अगर मुझे यूआईडी नहीं मिलती है, तो मैं सिर्फ एक नया उपयोगकर्ता बनाता हूं और उपयोगकर्ता को लॉगिन करता हूं।

  2. और अब से मोबाइल द्वारा सर्वर के लिए किए गए सत्र (बनाया है और वसंत सुरक्षा से जुड़ी) और मोबाइल एप्लिकेशन होगा हर अनुरोध पर

    प्रमाणित है

कोई मुझे बता सकते हैं अगर यह है चीजों को करने का एक अच्छा तरीका है? क्या मुझे सत्रों का उपयोग करना बंद कर देना चाहिए और स्प्रिंग-सिक्योरिटी-ओएयूटीएच 2 पर स्विच करना चाहिए?


संपादित करें 1

डेव सलाह यहाँ के आधार पर अद्यतन वसंत-सुरक्षा config है:

<!- handle login by providing a token--> 
    <security:http pattern="/login/facebook" auto-config="false" use-expressions="true" entry-point-ref="loginUrlAuthenticationEntryPoint"> 
       <security:custom-filter ref="facebookLoginFilter" position="FORM_LOGIN_FILTER"/> 
       <security:intercept-url pattern="/**" access="isAuthenticated()" /> 
    </security:http> 


    <bean id="loginUrlAuthenticationEntryPoint" class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint"> 
       <constructor-arg value="/login/facebook"></constructor-arg> 
    </bean> 

    <!-- handle basic username + password logins--> 
    <security:http auto-config="true" use-expressions="true" entry-point-ref="forbiddenEntryPoint"> 
       <security:form-login login-processing-url="/security_check" authentication-failure-handler-ref="authFailureHandler" 
            default-target-url="/" always-use-default-target="true" authentication-success-handler-ref="authSuccessHandler" /> 
       ... 
       my others patterns.. 
       ... 

     </security:http> 
<bean id="forbiddenEntryPoint" 
       class="org.springframework.security.web.authentication.Http403ForbiddenEntryPoint" /> 

      <bean id="authSuccessHandler" class="my.package.AuthenticationSuccessHandlerImpl"/> 
      <bean id="authFailureHandler" class="my.package.AuthenticationFailureHandlerImpl"/> 

      <bean id="facebookLoginFilter" class="pl.jcommerce.ocean.web.ws.controller.FacebookLoginFilter"> 
       <property name="requiresAuthenticationRequestMatcher" ref="loginRequestUrlHandler"></property> 
       <property name="authenticationManager" ref="authManager"></property> 
      </bean> 

      <security:authentication-manager id="authManager"> 
       <security:authentication-provider ref="facebookAuthenticationProvider" /> 
      </security:authentication-manager> 

      <security:authentication-manager> 
       <security:authentication-provider ref="webServiceUserAuthenticationProvider" /> 
      </security:authentication-manager> 

      <bean id="loginRequestUrlHandler" class="org.springframework.security.web.util.matcher.RegexRequestMatcher"> 
       <constructor-arg index="0" value="/login/facebook" /> 
       <constructor-arg index="1" value="POST" /> 
       <constructor-arg index="2" value="false" /> 
      </bean> 
+0

इस उद्देश्य के लिए एक वसंत फ़िल्टर लागू किया गया है।कृपया नीचे दिए लिंक देखें: "स्टेटलेस बाकी Endpoints के लिए स्प्रिंग प्रमाणीकरण फ़िल्टर जो प्रमाणीकरण के लिए फेसबुक टोकन का उपयोग" https://github.com/ozgengunay/FBSpringSocialRESTAuth – Ozgen

उत्तर

2

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

+0

आपके उत्तर के लिए धन्यवाद! मैंने सोचा कि ओउथ 2 का उपयोग फेसबुक लॉगिन को एकीकृत करना आसान होगा। सिर्फ एक विचार जहां मुझे सत्र से टोकन के आधार पर माइग्रेशन करने का मौका मिलेगा। जहां मैं उपयोगकर्ता को प्रमाणित करता हूं, वैसे ही यह कुछ है I * वास्तव में * यह सुनिश्चित नहीं था कि इसे कहां रखा जाए .. क्या आप मुझे फ़िल्टर में बैठने के लिए कहां से अधिक विस्तार से इंगित कर सकते हैं? – Johny19

+0

यदि मैं आप थे तो मैं 'उपयोगकर्ता नाम पासवर्डशब्द प्रमाणीकरण फ़िल्टर' के कार्यान्वयन को देखता हूं और इसे विभिन्न प्रमाण-पत्रों (उपयोगकर्ता नाम/पासवर्ड के बजाय एफबी टोकन) से निपटने के लिए अनुकूलित करता हूं। फिर आप 'userFassterAfhenticationFilter' के समान स्थिति में' addFilterAfter' का उपयोग करके फ़िल्टर जोड़ सकते हैं। –

+0

बिल्कुल सही धन्यवाद! मैंने यही किया है: एक वर्ग बनाएं जो उपयोगकर्ता नाम पासवर्ड को प्रमाणीकरण फ़िल्टर करता है और "प्रयास प्रमाणीकरण" विधि को ओवरराइड करता है। मैं कुछ बुनियादी जांच करता हूं और प्रिंसिपल के रूप में टोकन के साथ एक प्रमाणीकरण ऑब्जेक्ट बनाता हूं। मैंने फिर अपनी कॉन्फ़िगरेशन में इस बीन को बनाया है और मैंने इसे एक नए प्रमाणीकरण प्रदाता में पारित कर दिया है (जो फेसबुक ग्राफ टूल्स से संपर्क करके टोकन सत्यापन को संभालेगा यदि सब ठीक हो जाए तो मैं उपयोगकर्ता को प्रमाणीकृत करता हूं)। और अंत में मैंने कस्टम कॉन्फ़िगरेशन पॉइंट (/ लॉगिन/फेसबुक) के साथ मेरी कॉन्फ़िगरेशन में एक नया " Johny19

0

मैंने डेव सीयर के उत्तर के आधार पर इस तरह कुछ ऐसा करने के लिए एक क्रैक लिया जो उन्होंने वसंत सुरक्षा कोणीय सामग्री के साथ साथ रखा था। उदाहरण देखने के लिए मेरे forked गीथब रेपो देखें, विशेष रूप से security पैकेज में कक्षाएं देखें।

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