Sto sviluppando un'API REST che richiede l'autenticazione. Poiché l'autenticazione stessa avviene tramite un servizio web esterno su HTTP, ho pensato che avremmo distribuito token per evitare di chiamare ripetutamente il servizio di autenticazione. Il che mi porta chiaramente alla mia prima domanda:
È davvero meglio che richiedere ai client di utilizzare l'autenticazione di base HTTP su ogni richiesta e memorizzare nella cache le chiamate al servizio di autenticazione lato server?
La soluzione Basic Auth ha il vantaggio di non richiedere un round trip completo al server prima che le richieste di contenuto possano iniziare. I token possono potenzialmente avere un ambito più flessibile (ovvero concedere solo diritti a risorse o azioni particolari), ma ciò sembra più appropriato al contesto OAuth rispetto al mio caso d'uso più semplice.
Attualmente i token vengono acquisiti in questo modo:
curl -X POST localhost/token --data "api_key=81169d80...
&verifier=2f5ae51a...
×tamp=1234567
&user=foo
&pass=bar"
I api_key
, timestamp
e verifier
sono richiesti da tutte le richieste. Il "verificatore" viene restituito da:
sha1(timestamp + api_key + shared_secret)
La mia intenzione è quella di consentire solo le chiamate da parti conosciute e di impedire che le chiamate vengano riutilizzate alla lettera.
È abbastanza buono? Underkill? Eccessivo?
Con un token in mano, i clienti possono acquisire risorse:
curl localhost/posts?api_key=81169d80...
&verifier=81169d80...
&token=9fUyas64...
×tamp=1234567
Per la più semplice chiamata possibile, questo sembra un po 'orribilmente prolisso. Considerando che la shared_secret
volontà finirà per essere incorporata (almeno) in un'applicazione iOS, da cui presumo possa essere estratta, questo offre qualcosa al di là di un falso senso di sicurezza?