Sto lavorando a un'app che è pianificata per essere concessa in licenza agli OEM, che a sua volta lo offrirebbero come servizio ai propri utenti. Ospiteremmo il server dell'app e l'OEM potrebbe ospitare facoltativamente il client Web dell'app. Per questo motivo vogliamo che gli OEM consentano agli utenti di autenticarsi attraverso l'OEM, utilizzando le credenziali esistenti, senza richiedere che facciano un account specifico per l'app.
Ho un'idea su come ottenerlo, ma sento che dovrebbe esserci un modo migliore. In breve, il client invia un token di autorizzazione al server dell'app per conto dell'utente, identificandoli e l'OEM con cui si sono autenticati. In modo leggermente più dettagliato:
Una volta ottenuta una licenza per l'app, il nostro server e il server OEM negoziano una stringa segreta condivisa. (Non sono ancora sicuro se il segreto condiviso debba essere dettato da noi o scelto dall'OEM con un requisito minimo di lunghezza.) Quando un utente che ha già effettuato l'autenticazione con l'OEM carica prima l'app, il client invia una richiesta AJAX al server OEM che richiede un ticket di autenticazione e quindi lo inoltra al server dell'app con una richiesta POST. Questo ticket ha i parametri
userID, oemID, timestamp, token, digest
dove oemID
è una stringa che rappresenta l'OEM in questione, token
è un valore casuale generato dal server OEM e digest
è la codifica della stringa base64
HMAC( sharedSecret, userID"|"oemID"|"timestamp"|"token )
Il server delle app controlla il timestamp per verificare che il ticket sia ancora valido, quindi ottiene il corrispondente segreto condiviso per il dato oemID
e lo utilizza per hash il proprio digest. Quindi esegue nuovamente il hashing di entrambi i digest e li confronta tra loro. Se corrispondono entrambi, l'app server riconosce che la richiesta proviene da un utente autenticato nel client OEM e invia un cookie di sessione al browser dell'utente e memorizza userID
e oemID
nell'archivio sessioni. identificare in modo univoco le richieste future da quell'utente. (Possiamo supporre che userID sia univoco da un determinato OEM, ma non universalmente, quindi utilizzando entrambi.) Questa intera interazione (e tutte le attività nell'app) avviene su HTTPS.
Per lo più sono preoccupato del fatto che questo sistema si senta un po 'schifoso, ma potrebbe essere solo perché la maggior parte della mia precedente esperienza con i sistemi di autenticazione ha comportato semplici vecchie pagine di login, o fatto uso di librerie che estrapolano sostanzialmente tutto il lavoro . Questo schema è essenzialmente vitale o ci sono problemi evidenti o aree di miglioramento? Il controllo del ticket è sufficiente per fidarsi del messaggio di inizializzazione? Ha davvero senso fidarsi implicitamente del server OEM, o c'è qualche motivo e mezzo per mettere a repentaglio il processo di autenticazione in un modo che potrebbe influenzare più dei propri utenti? Per lo più, non lascia nulla di eclatante?