234 messaggi dal 08 marzo 2012
Ciao,

ho una web app asp.net mvc che deve permettere agli utenti di poter accedere tramite FB.
Stessa cosa deve avvenire su un'app Xamarin che stiamo realizzando.

La domanda è: se sull'app FB mi rilascia un access token dopo il login la web app questo token non lo conosce quindi non mi autorizzerebbe le chiamate ai suoi WS.
Qual è la corretta architettura e soluzione per permettere ad un utente di loggarsi tramite FB sull'app e poi di chiamare i WS di una web app?

Passare FacebookId e Access Token per autenticare a seguito della login FB l'utente anche sul backend, memorizzando l'accesso token per le seguenti chiamate ai WS? Non mi sembra il massimo, ma non capisco quale sia il giro più pulito.

grazie
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,


se sull'app FB mi rilascia un access token dopo il login la web app questo token non lo conosce

Beh, i token sono portabili quindi lo puoi inviare tale e quale alla web api che lo userà per recuperare i dati dell'utente da Facebook.
Ottenute queste informazioni, puoi infilare un token emesso da te nella risposta (es. come intestazione). L'app lo leggerà e in tutte le successive richieste ti invierà il token che conosci, così che tu non debba fare continuamente richieste a facebook.

Apro una parentesi: qualche anno fa (l'ultima volta che ci ho lavorato), ricordo che facebook mi mandava un json con i dati dell'utente ed una stringa che era l'hash di tale json. Per verificare che le informazioni del json non fossero state alterate, potevo ricalcolarmi l'hash in base all'app secret. Se l'hash corrispondeva a quello fornito, era la prova che i dati non erano stati alterati e perciò l'utente era effettivamente chi diceva di essere.

Vedo che oggi il modo per verificare un access token è inviare una richiesta a facebook.
https://developers.facebook.com/docs/facebook-login/manually-build-a-login-flow#checktoken

ciao,
Moreno
Modificato da BrightSoul il 07 settembre 2017 19.27 -

Enjoy learning and just keep making
234 messaggi dal 08 marzo 2012
Ottimo, grazie mille. Lo implemento nei prox giorni.

Ne approfitto per farti un'altra domanda.
Alcuni servizi del backend sono privi di controllo dell'autenticazione, esempio "Registrazione nuovo utente", "Recupero password" e "Login" in quanto ovviamente non essendosi ancora loggato l'utente non ho modo di proteggere la chiamata e devo aprirla anche ad utenti anonimi.

Ho quindi pensato di definire una chiave statica, una sorta di token applicativo, memorizzato sul backend ed archiviato all'interno dell'app.
In questo modo quando l'app chiama i tre WS sopra indicati deve passare anche il token (statico che non cambia mai) così che il server possa vedere se combacia con il suo.

Ovviamente il server espone tutti i servizi su HTTPS, dunque sul canale questo informazione è illeggibile.

Mi chiedo però se sull'app sarebbe possibile intercettare i pacchetti in uscita ed analizzarli, scoprendo quindi la chiave di interscambio.

E' un metodo sicuro oppure sto sbagliando strada? Tu come lo implementeresti?

Grazie!
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,
il motivo per cui vuoi usare il token statico è che vuoi evitare che la tua Web API si possa consumare al di fuori dell'app mobile?

Magari, oltre al token statico, invia anche un valore casuale giusto per variare il contenuto di ogni richiesta.

A proposito del come salvare il token, leggi questo articolo.
http://www.androidauthority.com/how-to-hide-your-api-key-in-android-600583/

Se uno è veramente determinato potrebbe entrare in possesso di tale token dato che lo devi veicolare insieme all'app.
Dipende dal tipo di applicazione ma in genere mi preoccupano di più gli abusi del servizio. Quando un utente è loggato, potrebbe automatizzare determinate operazioni per estrarre tutti i dati possibili dal tuo servizio. In questo caso è importante riuscire a rilevare tali abusi e porvi un freno.

ciao,
Moreno

Enjoy learning and just keep making
234 messaggi dal 08 marzo 2012
Esatto voglio evitare che i servizi possano essere consumati al di fuori dell'app.
Non mi è chiaro cosa intendi con un valore variabile che cambia ad ogni richiesta...intendi forse qualcosa che inganni chi eventualmente lo intercetta ma che poi lato server vado ad ignorare?

Cosa intendi infine con la possibilità di estrarre tutti i dati una volta che un utente è loggato? Come impedirlo?

Grazie
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,


Non mi è chiaro cosa intendi con un valore variabile che cambia ad ogni richiesta...intendi forse qualcosa che inganni chi eventualmente lo intercetta ma che poi lato server vado ad ignorare?

Sì, una cosa del genere.


Cosa intendi infine con la possibilità di estrarre tutti i dati una volta che un utente è loggato? Come impedirlo?

Ipotizziamo che tu stia sviluppando un'app che ti dice il modello di un'auto inserendone la targa. Un utente "normale" va lì, digita una targa, legge il modello dell'auto e chiude l'app.
Un utente malintenzionato potrebbe trovare il modo di automatizzare questa funzionalità per cercare tutte le targhe da AA000AA fino all'ultima esistente. Diciamo che in capo ad un'ora riesce ad estrarre qualche migliaio di modelli di auto, anche perché ha messo una decina di smartphone a lavorare in parallelo. Con queste informazioni ci compila un database e poi si rivende le statistiche sulle auto comprate dagli italiani nel corso degli anni.

Vuoi consentirgli di farlo?
Se non vuoi consentirglielo, puoi adottare un meccanismo di throttling delle richieste tipo questo:
http://www.aspitalia.com/script/1200/Limitare-Numero-Richieste-ASP.NET-Web-API.aspx


Tutto però dipende dal tipo di applicazione che stai sviluppando e se si presta ad essere "abusata".

ciao,
Moreno
Modificato da BrightSoul il 10 settembre 2017 18.34 -

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.