5

Ich habe einen Backend-Server (Java/Spring/Spring Security). Wenn Benutzer sich gerade von einer mobilen App anmelden, senden sie einfach ihren Benutzernamen/ihr Passwort und Spring Security erstellt eine Sitzung und weist sie der Anfrage mit einer JSESSIONID zu.Akzeptiere Facebook Login in meine REST API

Wir hätten jetzt auch einen Button auf der mobilen App "Login with Facebook". Hier ist mein Verständnis davon, wie es funktionieren wird.

  1. mobile app nutzt Facebook SDK ein "access_token"
  2. mobile app retrive Benutzerprofil von Facebook (Name, Vorname, E-Mail etc ..)
  3. mobilen Kontrollen (gegen MY-Server) zu erhalten, wenn der Benutzername einzigartig ist
  4. wenn Benutzername einzigartig, mY REST-aPI-Aufruf, mit so etwas wie dieses/login/facebook POST über SSL und das Bestehen der access_token, E-Mail, Benutzername etc ...)
  5. meinem Server prüft dann, ob die access_token ist gültig

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

  6. Wenn ja, wenn die UID von Facebook zurück in meiner lokalen Datenbank bereits vorhanden ist, ich den Benutzer wie folgt signin:
SecurityContextHolder.getContext().setAuthentication(
       new UsernamePasswordAuthenticationToken(username, null, ROLE_USER)); 
  1. Wenn ich die UID nicht finde, erstelle ich einfach einen neuen Benutzer und melde mich beim Benutzer an.

  2. und von jetzt an jedem auf den Server von den mobilen gestellten Antrag wird die Sitzung (erstellt und angebracht durch Feder Sicherheit) und die mobile App ist

mir jemand authentifiziert haben könnte sagen, ob dies ein guter Weg, Dinge zu tun? Sollte ich aufhören, Sitzungen zu verwenden und zu Spring-Security-OAUTH2 wechseln?


EDIT 1

Basierend auf Dave Ratschläge hier ist die aktualisierte feder Sicherheit 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

Ein Federfilter ist für diesen Zweck implementiert.Bitte beachten Sie unter folgendem Link: „Spring Authentifizierungsfilter für Stateless REST-Endpunkte, die Facebook nutzen Token zur Authentifizierung“ https://github.com/ozgengunay/FBSpringSocialRESTAuth – Ozgen

Antwort

2

Facebook ist bereits OAuth2 Server-Seite verwendet wird, und stellt eine eigene nativen SDK für Clients, daher sehe ich keinen Vorteil in Ihrem Fall der Verwendung von OAuth2 auf Ihrem Server, es sei denn, Ihr Anwendungsfall geht über das hinaus, was Sie oben beschrieben haben. Frühling OAuth2 hat auch clientseitige Unterstützung, aber nicht in einer nativen App, so dass ich im Prinzip nichts wirklich falsch mit Ihrem Vorschlag sehe. Sie haben nicht im Detail gesagt, wo Sie den Sicherheitskontext in Ihrem Server einrichten würden, und ich denke, das könnte ein wichtiges Detail sein - es muss in der Sicherheitsfilterkette an der richtigen Stelle passieren, um die Sitzung zu erhalten aktualisiert.

+0

Vielen Dank für Ihre Antwort! Ich dachte, mit Oauth2 wäre es einfacher, den Facebook-Login zu integrieren. Nur eine Idee, bei der ich die Migration von Session-basiert zu Token durchführen konnte. In Bezug darauf, wo ich den Benutzer authentifizieren würde, nun, das ist etwas, von dem ich * wirklich * nicht sicher bin, wo ich es hinstellen könnte. Könnten Sie mich näher darauf hinweisen, wo es in den Filtern sitzen muss? – Johny19

+0

Wenn ich Sie wäre, würde ich mir die Implementierung von 'UsernamePasswordAuthenticationFilter' anschauen und sie so anpassen, dass sie mit verschiedenen Anmeldeinformationen umgehen kann (fb token statt Benutzername/Passwort). Sie können dann den Filter hinzufügen, indem Sie 'addFilterAfter' an der gleichen Stelle wie' UsernamePasswordAuthenticationFilter' verwenden. –

+0

perfekt danke! Folgendes habe ich getan: Erstellen Sie eine Klasse, die UsernamePasswordAuthenticationFilter erweitert und die Methode "versuchAuthentifizierung" überschreibt. Ich mache einige grundlegende Überprüfung und erstellen Sie ein Authentifizierungsobjekt mit dem Token als Prinzipal. Ich habe dann diese Bohne in meiner Config erstellt und ich habe sie in einem neuen authenticationProvider übergeben (der die Token-Verifizierung durch Kontaktaufnahme mit facebook graph tools übernimmt, wenn alles gut geht, authentifiziere ich den Benutzer). und schließlich habe ich in meiner config mit einem benutzerdefinierten Einstiegspunkt (/ login/facebook) ein neues " Johny19

0

Ich habe einen Riss bei der Implementierung von etwas wie diesem genommen, basierend auf Dave Syers Antwort hier zusammen mit den Spring Security Angular Materialien, die er zusammenstellte. Um ein Beispiel zu sehen, siehe meine forked Github Repo, speziell die Klassen in der security Paket.