Ci sono molti modi per scuoiare un gatto, ma per il tuo contesto ti suggerisco quanto segue.
Innanzitutto, autentifica i server con TLS / SSL. Ovviamente, questo solo autentica il server, non il client; quindi, per autorizzare una richiesta, il server deve contattare quello che si aspetta sia il server di origine e cercare la conferma.
Autorizzazione richiesta API
Lo scambio sarebbe simile a questo:
Client Server B Server A
| ----- data -----> | |
| | --- validate ---> |
| | <------ ok ------ |
| <--- response --- |
- Un client non autenticato effettua una chiamata API a un server autenticato tramite SSL / TLS, la richiesta contiene un token di autenticazione.
- Il server ricevente prende il token di autenticazione e contatta quello che dovrebbe essere il server che ha generato la richiesta e chiede se ha generato il token di autenticazione. Ora questo server di origine è stato autenticato anche tramite SSL / TLS.
- A seconda che il token di autenticazione sia stato convalidato, la richiesta API può essere approvata / rifiutata.
Sintassi conversazionale
- Cliente - > Server B: "Do X, Y, Z. Auth: abdhs67ruhbf"
- Server B - > Server A: "Mi hai inviato una richiesta con Auth: abdhs67ruhbf"
- Server A - > Server B: "Sì."
- Server B - > Client: "Risultato: A, B, C".
Ovviamente questo ha un costo di latenza elevato se i server sono lontani tra loro.
Note aggiuntive
-
Come suggerisce Utente949300 , sarebbe consigliabile inserire un tempo di scadenza sui codici di autorizzazione quando vengono generati (ad esempio TTL a 24 ore) in modo che gli aggressori non provino a sfruttare i vecchi token.
-
Per lo stesso motivo, quando viene ricevuta la risposta a una chiamata API, il token utilizzato per effettuare la chiamata deve essere revocato.