Il nostro prodotto registra nuovi giocatori sul nostro servizio e abbiamo scelto di ospitarli su Azure (stiamo usando .NET) e volevamo che fosse stateless (per la scalabilità) e relativamente sicuro.
Poiché questo è il primo REST WS che sto scrivendo, volevo ottenere un riscontro sul fatto che si tratti di una soluzione solida.
Alcune supposizioni sulla nostra app:
- Gli utenti sono registrati nel servizio in modo anonimo, senza richiedere una password da un utente
- Il WS deve essere completamente senza stato per consentire il ridimensionamento orizzontale
- Ci stiamo connettendo tramite HTTPS (SSL) per impedire lo snooping di terze parti
Modifica
- Puntiamo ai dispositivi iOS / Android nativi
- La nostra preoccupazione principale è fare in modo che solo i client non manomessi possano inviare richieste
E il processo di autenticazione astratto:
- Il client crea un semplice hash (UDID: Timestamp) e lo crittografa utilizzando il timestamp con un algoritmo di base (ad esempio, la chiave segreta è ogni 2 ° carattere dell'hash)
- Il client invia il suo UDID, Timestamp & hash al server
- Il server ricostruisce l'hash e decrittografa l'hash crittografato inviato dall'utente
- Se i due sono uguali, sappiamo che è stato effettivamente inviato dal nostro client (e si spera non da un mittente dannoso)
Qualsiasi input / suggerimento sarebbe fantastico - ovviamente visto che è la prima volta che gestisco questo problema, forse l'ho progettato in modo errato.
Grazie!
Secondo aggiornamento:
Leggendo le specifiche di sicurezza per OAuth, sembra che non ci sia una vera risposta alla mia domanda - dal momento che il client e il server devono conoscere le chiavi segrete e il client è memorizzato localmente sui dispositivi mobili dei nostri utenti (al contrario di un web app).
Dalla guida alla sicurezza di OAuth ( link ):
When implementing OAuth, it is critical to understand the limitations of shared secrets, symmetric or asymmetric. The client secret (or private key) is used to verify the identity of the client by the server. In case of a web-based client such as web server, it is relatively easy to keep the client secret (or private key) confidential.
However, when the client is a desktop application, a mobile application, or any other client-side software such as browser applets (Flash, Java, Silverlight) and scripts (JavaScript), the client credentials must be included in each copy of the application. This means the client secret (or private key) must be distributed with the application, which inheritably compromises them.
This does not prevent using OAuth within such application, but it does limit the amount of trust the server can have in such public secrets. Since the secrets cannot be trusted, the server must treat such application as unknown entities and use the client identity only for activities that do not require any level of trust, such as collecting statistics about applications. Some servers may opt to ban such application or offer different protocols or extensions. However, at this point there is no known solution to this limitation.