Sto progettando un servizio Web RESTful a cui gli utenti devono accedere, ma anche altri servizi Web e applicazioni. Tutte le richieste in arrivo devono essere autenticate. Tutte le comunicazioni avvengono tramite HTTPS. L'autenticazione dell'utente funzionerà in base a un token di autenticazione, acquisito tramite POST del nome utente e della password (su una connessione SSL) a una risorsa / session fornita dal servizio.
Nel caso dei client del servizio Web, non vi è alcun utente finale dietro il servizio client. Le richieste vengono avviate da attività pianificate, eventi o altre operazioni del computer. L'elenco dei servizi di connessione è noto in anticipo (ovviamente, immagino). Come devo autenticare queste richieste provenienti da altri servizi (web)? Voglio che il processo di autenticazione sia il più semplice possibile da implementare per questi servizi, ma non a scapito della sicurezza. Quali sarebbero lo standard e le migliori pratiche per uno scenario come questo?
Opzioni a cui posso pensare (o che mi sono state suggerite):
Chiedi ai servizi client di ricorrere a un nome utente e una password "falsi" e di autenticarli allo stesso modo degli utenti. Non mi piace questa opzione, semplicemente non mi sembra giusta.
Assegna un ID applicazione permanente per il servizio client, possibilmente anche una chiave dell'applicazione. Per quanto ho capito, è come avere nome utente + password. Con questo ID e questa chiave, posso autenticare ogni richiesta o creare un token di autenticazione per autenticare ulteriori richieste. Ad ogni modo, questa opzione non mi piace, perché chiunque possa ottenere una copia dell'ID e della chiave dell'applicazione può impersonare il client.
Potrei aggiungere un controllo dell'indirizzo IP all'opzione precedente. Ciò renderebbe più difficile eseguire richieste false.
Certificati client. Imposta la mia autorità di certificazione, crea il certificato radice e crea certificati client per i servizi client. Mi vengono in mente un paio di problemi: a) come posso ancora consentire agli utenti di autenticarsi senza certificati eb) quanto è complicato questo scenario da implementare dal punto di vista del servizio client?
Qualcos'altro: ci devono essere altre soluzioni là fuori?
Il mio servizio sarebbe in esecuzione su Java, ma ho deliberatamente tralasciato le informazioni su quale framework specifico sarebbe stato costruito, perché sono più interessato ai principi di base e non tanto ai dettagli di implementazione - presumo che la soluzione migliore per questo sarà essere possibile implementare indipendentemente dal framework sottostante. Tuttavia, sono un po 'inesperto con questo argomento, quindi saranno molto apprezzati anche suggerimenti ed esempi concreti sull'attuale implementazione (come utili librerie di terze parti, articoli, ecc.).