In dettaglio, ecco il problema:
Sto costruendo un'app per Android, che consuma la mia API REST sul back-end. Ho bisogno di creare un'API di registrazione e accesso per iniziare. Dopo aver cercato con Google per un po ', mi sembra che ci siano solo due approcci che posso adottare.
- Durante la registrazione, utilizzo link e ottengo le credenziali dell'utente; salvarlo nel mio DB contro il nome utente (lato server). Durante l'accesso, utilizzo ancora link e chiedo le credenziali dell'utente; verificare la password hash sul DB e restituirgli un ID di sessione, che sto pianificando di non scadere mai a meno che non esca. Inoltre, qualsiasi altra chiamata API (GET / POST) che l'utente effettua, sarà accompagnata da questo ID di sessione in modo da poter verificare l'utente.
Ma nell'approccio sopra sono obbligato a utilizzare link per qualsiasi chiamata API, altrimenti sono vulnerabile a Man in the Middle Attack , ovvero se qualcuno annusa il mio ID di sessione, può ricostruire simili richieste GET / POST che non vorrei. Ho ragione con l'assunto sopra?
- La seconda opzione è seguire il percorso di Amazon Web Services , dove uso l'autenticazione della chiave pubblica / privata. Quando un utente si registra, utilizzo l'API link per salvare le sue credenziali nel DB. Da quel momento in poi userò la password hash dell'utente come chiave privata. Qualsiasi ulteriore chiamata API che l'utente farà avrà un blob hash dell'URL della richiesta utilizzando la chiave privata dell'utente. Sul lato server ricostruisco l'hash utilizzando la chiave privata salvata. Se l'hash è una corrispondenza, lascio che l'utente faccia il suo compito, altrimenti rifiuta. In questa opzione ho bisogno di usare link solo per l'API di registrazione. Il REST può continuare su link .
Ma qui lo svantaggio è che sono costretto ad ospitare la mia API di registrazione in una directory virtuale separata (sto usando IIS e non sono sicuro di poter ospitare entrambe le API http e https nella stessa directory virtuale ). Quindi sono costretto a sviluppare l'API di registrazione in un file di progetto separato. Di nuovo, ho ragione con l'ipotesi precedente?
Modifica: sto utilizzando ASP.NET MVC4 per creare l'API Web.
Il motivo per cui sono riluttante a utilizzare link per tutte le mie chiamate API REST è che ritengo che non sia leggero e crei più payload della rete, il che potrebbe non essere più adatto per un'app mobile. Ulteriore crittografia / decodifica e ulteriore stretta di mano richiesta possono ulteriormente incidere sulla durata della batteria del cellulare? O non è significativo?
Quale dei due precedenti suggerimenti suggeriresti?
PS: siamo andati con Https ovunque, ed è stata la decisione migliore. Maggiori informazioni sul mio blog .