È possibile distribuire SSL reciprocamente autenticati tra i client legittimi e l'API. Genera un certificato client SSL autofirmato e memorizzalo nel tuo client. Configura il tuo server per richiedere l'autenticazione lato client e accetta solo i certificati che hai distribuito ai tuoi clienti. Se qualcuno/qualcosa che tenta di connettersi non ha quel certificato client, non sarà in grado di stabilire una sessione SSL e la connessione non verrà effettuata. Supponendo che controlli i client legittimi e i server, non hai bisogno di un certificato emesso dalla CA qui; è sufficiente utilizzare i certificati autofirmati poiché si controlla sia il trust del certificato lato client sia quello lato server.
Ora, si fa notare che è davvero difficile impedire a qualcuno di decodificare il client e recuperare le credenziali (la chiave privata che appartiene al certificato client, in questo caso). E hai ragione. Normalmente, memorizzerai quella chiave (e il certificato) in un keystore di qualcosa (uno KeyStore
se stai usando Android) e quel keystore sarà crittografato. Quella crittografia è basata su una password, quindi dovrai (1) memorizzare la password nel tuo client da qualche parte, o (2) chiedere all'utente la password quando avvieranno l'app client. Quello che devi fare dipende dal tuo caso. Se (2) è accettabile, hai protetto le tue credenziali contro il reverse engineering poiché sarà crittografato e la password non verrà memorizzata da nessuna parte (ma l'utente dovrà digitarlo in ogni momento). Se si esegue (1), quindi qualcuno sarà in grado di decodificare il client, ottenere la password, ottenere il keystore, decrittografare la chiave privata e il certificato e creare un altro client che sarà in grado di connettersi al server.
Non c'è niente che puoi fare per impedirlo; puoi rendere più difficile il reverse engineering del codice (offuscamento, ecc.) ma non puoi renderlo impossibile.È necessario determinare quale sia il rischio che si sta tentando di mitigare con questi approcci e quanto vale la pena lavorare per attenuarlo.
Il passo OAuth è su SSL. Sto provando a proteggere un'API che verrà chiamata da diversi client in esecuzione su un computer degli utenti. Il codice di autenticazione che ottengo dal flusso OAuth viene passato a tutte le chiamate API nell'intestazione Autorizzazione della richiesta. Il codice viene quindi verificato sul server. – Evan
È OAuth2, deve essere su SSL. –