Possiedo un'applicazione web (applicazione a singola pagina con Angular), che richiede alcuni dati attraverso un set di API REST basate sulla mia applicazione lato server (utilizzando Play Framework 2.2.1).
Quindi, in sostanza, non sono un esperto in sicurezza e quindi inizialmente volevo utilizzare uno "strumento" per implementare facilmente l'autenticazione. Così ho scelto di utilizzare SecureSocial .
Lo personalizzo per adattarlo alle mie esigenze, ma dopo aver letto alcuni documenti sullo schema di autenticazione REST, mi sono reso conto che probabilmente sono in un modo sbagliato.
Perché? Semplicemente perché si basa su un meccanismo Session-token piuttosto che su una soluzione stateless completa.
In breve, il flusso di lavoro dell'autenticazione è:
- L'utente accede all'applicazione Web tramite un modulo tradizionale (e-mail / password)
- Il server verifica la validità delle credenziali (confronta gli hash di BCrypt per la password) e, se valido, restituisce un cookie contenente un tipo di token di autenticazione. Questo token di autenticazione viene anche memorizzato nella cache del server (Riproduci configurato per accedere a un negozio Memcached), in modo da poter effettuare alcuni confronti ogni volta che l'utente richiede una funzionalità limitata (in termini di visibilità).
Professionisti di questa soluzione:
..questo funziona bene per controllare l'accesso all'API RESTRICTED
Svantaggi:
- Questa soluzione richiede un archivio dati per memorizzare il token di autenticazione sui server, al fine di confrontare quelli forniti dal client ad ogni tentativo di richiesta. Attualmente, faccio uso di Memcached.
- Impossibile limitare l'accesso a qualche piccolo elenco di client. In effetti, cosa succede se voglio limitare tutti gli accessi API REST alla mia applicazione? Sicuramente necessario per una specie di chiave API / chiave segreta API per implementare Autorizzazione e non semplicemente Autenticazione.
Ad esempio, non desidero assolutamente consentire a linee di comando esterne o siti Web esterni di accedere alle API anche se sono riusciti a completare la fase di autenticazione fornendo alcune buone credenziali.
Peggio, non avrebbero avuto difficoltà ad accedere ad alcuni dati inizialmente pubblici, ovvero senza autenticazione come ad esempio: prendere una lista di un insieme di dati precisi. - Sembra essere molto vulnerabile ad alcuni attacchi noti se i trasferimenti HTTPS non sono garantiti.
Ho sentito e letto molto su HTTP BASIC ma sembra che dovrebbe essere evitato: link
Poi ho letto della soluzione HMAC, come implementa Amazon, e sembra una buona soluzione; OAuth1 sembra troppo complicato per i casi semplici che voglio.
Dovrei provare ad implementare la soluzione HMAC?
La soluzione HMAC è davvero compatibile con un browser, ovvero consente all'utente di chiamare per diverse operazioni distinte senza dover eseguire l'autenticazione ogni volta?
Coinvolge gli scambi di gettoni in questo caso per fare questo trucco?
Sarei davvero felice se qualcuno potesse presentarmi il concetto di HMAC mentre gestisco un'applicazione / browser Web.
In effetti, faccio fatica a trovare alcune documentazioni sullo schema HMAC abbinato al browser.
O forse, ti fidi davvero di una soluzione Oauth? ...
Sto meditando sull'argomento ...