Panoramica
Sto cercando di creare un'API (REST) per la mia applicazione. Lo scopo iniziale / primario sarà per il consumo da app mobili (iPhone, Android, Symbian, ecc.). Ho esaminato diversi meccanismi di autenticazione e autorizzazione per le API basate sul web (studiando altre implementazioni). Ho la testa avvolta attorno alla maggior parte dei concetti fondamentali, ma sto ancora cercando una guida in alcune aree. L'ultima cosa che voglio fare è reinventare la ruota, ma non trovo soluzioni standard che soddisfino i miei criteri (tuttavia i miei criteri sono sbagliati, quindi sentiti libero di criticare anche quello). Inoltre, voglio che l'API sia la stessa per tutte le piattaforme / applicazioni che la utilizzano.
oAuth
Vado avanti e lancio la mia obiezione a oAuth poiché so che probabilmente sarà la prima soluzione offerta. Per le applicazioni mobili (o più specificamente le applicazioni non web), sembra sbagliato lasciare l'applicazione (per accedere a un browser Web) per l'autenticazione. Inoltre, non è possibile (sono a conoscenza) che il browser restituisca il callback all'applicazione (in particolare multipiattaforma). Conosco un paio di app che lo fanno, ma mi sento male e fa una pausa nell'UX dell'applicazione.
Requisiti
- L'utente inserisce nome utente / password nell'applicazione.
- Ogni chiamata API viene identificata dall'applicazione chiamante.
- Il sovraccarico è ridotto al minimo e l'aspetto degli autori è intuitivo per gli sviluppatori.
- Il meccanismo è sicuro sia per l'utente finale (le sue credenziali di accesso non sono esposte) sia per lo sviluppatore (le loro credenziali dell'applicazione non sono esposte).
- Se possibile, non richiedere https (non è affatto un requisito difficile).
I miei pensieri attuali sull'implementazione
Uno sviluppatore esterno richiederà un account API. Riceveranno un apikey e un apisecret. Ogni richiesta richiederà almeno tre parametri.
- apikey: dato allo sviluppatore alla registrazione
- timestamp - funge anche da identificatore univoco per ciascun messaggio per un dato apikey
- hash: un hash del timestamp + l'apisecret
L'apikey è necessario per identificare l'applicazione che ha emesso la richiesta. Il timestamp agisce in modo simile a oauth_nonce ed evita / mitiga gli attacchi di riproduzione. L'hash assicura che la richiesta sia stata effettivamente emessa dal proprietario dell'apikey specificato.
Per le richieste autenticate (quelle fatte per conto di un utente), sono ancora indeciso tra una route access_token o una combinazione di hash nome utente e password. Ad ogni modo, ad un certo punto sarà richiesta una combinazione nome utente / password. Quindi, quando lo fa, verrebbe utilizzato un hash di più informazioni (apikey, apisecret, timestamp) + la password. Mi piacerebbe un feedback su questo aspetto. Cordiali saluti, dovrebbero prima hash la password, dal momento che non memorizzo le password nel mio sistema senza hash.
Conclusione
Cordiali saluti, questa non è una richiesta per come costruire / strutturare l'API in generale solo come gestire l'autenticazione e l'autorizzazione esclusivamente all'interno di un'applicazione.
Pensieri casuali / domande bonus
Per le API che richiedono solo un'apikey come parte della richiesta, come evitare che qualcuno diverso dal proprietario dell'apikey sia in grado di vedere l'apikey (dal momento che è stato inviato in chiaro) e fare richieste eccessive per superare i limiti di utilizzo? Forse sto solo pensando a questo, ma non dovrebbe esserci qualcosa per autenticare che una richiesta è stata verificata per il proprietario di Apikey? Nel mio caso, quello era lo scopo dell'apisecret, che non è mai mostrato / trasmesso senza essere sottoposto a hash.
A proposito di hash, che dire di md5 vs hmac-sha1? Importa davvero quando tutti i valori sono sottoposti a hash con dati sufficientemente lunghi (es. Apisecret)?
In precedenza avevo considerato l'aggiunta di un salt per utente / riga all'hash della password dei miei utenti. Se dovessi farlo, come potrebbe l'applicazione essere in grado di creare un hash corrispondente senza conoscere il sale utilizzato?