Sto lavorando su un servizio che inoltra / unifica le nostre chiamate API a piattaforme / servizi esterni.
Ad esempio, diciamo che non voglio gestire tutte le azioni possibili (creare post, recuperare post, modificare post, elencare i post) per Facebook, Twitter, LinkedIn, Google+ a ciascun servizio rivolto all'utente. Pertanto, i servizi rivolti all'utente chiamano questo inoltro API con un messaggio, in qualche modo specifica il servizio da pubblicare a nome e per conto di quale utente proviene la richiesta.
Per inoltrare correttamente la chiamata, devo identificare:
-
il servizio chiamante, per il quale utilizzo l'intestazione Autorizzazione.
-
il servizio a cui inoltrare.
-
l'utente che ha avviato la richiesta. Non dovrei memorizzare le credenziali del servizio esterno dell'utente finale (ad esempio i token di Facebook) nel servizio chiamante ma nel servizio di inoltro.
Ho alcune opzioni su come passare questi dati, e qualsiasi input sarebbe apprezzato:
-
Specifica il servizio e l'utente come risorse secondarie nell'URL %codice% Per esempio. %codice% Questo mi sembra abbastanza prolisso.
-
Utilizza i parametri di query. %codice% Per esempio.
/service/{externalServiceName}/user/{userReference}/Object/{objectId}
-
Sovraccarico dell'intestazione Autorizzazione con: %codice% Risultato con URL piacevoli (GET / posts /).
Questo sembra totalmente fuori dalle specifiche.Si scopre che specificare più valori per un'intestazione separata da una virgola è nella specifica. -
Utilizza intestazioni personalizzate: %codice% Di nuovo, con URL piacevoli e brevi (
GET /service/facebook/user/uid123/posts/post345
). -
Utilizza un mix di intestazioni e risorse personalizzate nell'URL: %codice% Questo ha senso per me perché: 1. il UserReference è in realtà un secondo livello di autorizzazione comunque. 2. Il servizio è la risorsa che possiede l'oggetto. Cioè lo stesso objectId può puntare a risorse diverse in servizi diversi.
-
Usa JWT per passare il servizio e l'utente, firmato con il segreto del servizio chiamante.
/Object/{objectId}?service={externalServiceName}&user={userReference}
Grazie!