Implementare Facebook login in un’app iOS e PHP

Qualche mese fa parlavo con dei miei colleghi riguardo alla migliore tecnica per implementare il classico Login Facebook all’interno di un servizio tramite l’app iOS in modo sicuro.

La difficoltà più grande che abbiamo avuto è stata quella di capire quale migliore tecnica ci permettesse di sfruttare l’SSO in modo intelligente. In particolar modo c’erano due punti chiave:

  1. L’utente non deve rendersi conto di niente e ritrovarsi loggato/registrato
  2. Il servizio (quindi il CMS che gestisce l’anagrafica utenti) deve registrare un  utente valido

Poi qualche giorno fa mi sono ritrovato a dover implementare OAuth e SSO su segnala.net e mi sono dovuto rimboccare le maniche per implementare quanto avevo descritto.

La situazione era questa: CMS Apache, PHP, MySQL e applicazione iOS (Swift).
Il CMS gestisce l’anagrafica e quindi se un utente deve accedere, prima deve loggarsi o registrarsi.

Nel CMS ho installato un server OAuth così da poter avere accesso alle API solo tramite autenticazione OAuth, poi ho iniziato a scrivere il codice che si occupa di gestire l’SSO.

La logica è descritta nell’immagine:

Logica SSO-OAuth per implementare il Facebook login

*[SSO Data] sono i dati richiesti per la verifica dell’accesso. Ad esempio con Facebook ho utilizzato il Token e lo User ID.

I passaggi logici sono questi:

  • L’app richiede a Facebook, tramite l’SDK, l’accesso. Facebook quindi mi passa il suo Token e lo user ID.
  • L’app quindi richiede tramite API al mio CMS l’accesso tramite questi due dati.
  • Il CMS accede quindi a Facebook tramite Graph e controlla che il token sia valido e che corrisponda allo user ID passato
  • Se tutto va a buon fine va a pescare l’indirizzo email dell’utente e qualche altra informazione necessaria ad una eventuale registrazione
  • Una volta presi i dati necessari va a controllare se esiste un utente registrato con l’email trovata
  • Se esiste crea un token di accesso e lo passa all’app
  • Se non esiste crea un nuovo utente con i dati Facebook, crea un token di accesso e lo passa all’app

Questa logica è applicabile ad ogni tipo di SSO Provider e mi è sembrata molto sicura sia dalla parte dell’app che da quella del server.

Se avete domande o suggerimenti commentate pure!