Mi piace il modo in cui OAuth / OpenID può autenticare / identificare un utente da un altro dominio, ma solo se l'altro dominio lo consente (presumibilmente sulle istruzioni dell'utente).
Mi piacerebbe fare qualcosa di simile, ma usando CORS AJAX o un'alternativa come JSONP. Il problema è che quando si utilizza un reindirizzamento a pagina intera, il "dominio di accesso" può essere certo su quale dominio fornisca auth_token / info, perché sta emettendo un Redirect HTTP stesso. Tuttavia, questo non è vero per JSONP.
I miei pensieri attuali sono di seguito, e le mie domande sono:
- Quali sono i punti deboli in questo modello?
- C'è un modo per farlo senza due richieste separate (per il caso non CORS)?
Caso generale:
MODIFICA: questa sezione inizialmente presupponeva una richiesta JSONP - infatti, penso che potrebbe essere qualsiasi tipo di dati
Caso A : utente che ha effettuato l'accesso sul "dominio di accesso" (utilizzando i cookie)
- Il client inoltra una richiesta al "dominio di accesso", fornendo un URL sul "dominio del servizio"
- Il server di login esamina l'URL fornito e pensa "sì, va bene" e restituisce una risposta HTTP Redirect (3XX) che include un auth_token / qualsiasi cosa nell'URL
- Il client segue il reindirizzamento al dominio del servizio. Il dominio del servizio memorizza il auth_token / qualsiasi cosa nella sessione e restituisce una risorsa statica (ad esempio un'immagine)
- Il client effettua quindi una seconda richiesta al dominio del servizio (non è consentita alcuna origine incrociata) per recuperare il token_autore / qualunque sia.
Caso B : l'utente non ha effettuato l'accesso sul "dominio di accesso" o non ha autorizzato i dettagli di condivisione con il "dominio del servizio".
- Il client inoltra una richiesta al "dominio di accesso", fornendo un URL sul "dominio del servizio"
- Il server di login restituisce una risposta HTTP Redirect (3XX) che include uno stato "non autorizzato" nell'URL (o forse l'URL di un accesso OAuth a pagina intera)
- Il client segue il reindirizzamento al dominio del servizio. Il dominio del servizio memorizza lo stato "non autorizzato" nella sessione, restituendo una risorsa statica al client.
- Il client effettua quindi una seconda richiesta al dominio del servizio (non è consentita alcuna origine incrociata) per scoprire che l'autorizzazione / identificazione non è riuscita.
Caso C : altro sito che tenta di ispezionare lo stato di accesso
- L'utente naviga verso il sito dubbia
- Il client effettua una richiesta al server di login, fornendo un URL sul effettivo dominio di servizio
- Il server di login reindirizza a una pagina del dominio del servizio effettivo, che restituisce un risultato statico
- L'utente può o non può aver effettuato l'accesso - ma il client non può scoprirlo perché l'endpoint "dominio del servizio" che gli dirà è vietato dalla restrizione di origine incrociata
Caso CORS AJAX
Se l'endpoint "server di accesso" ha CORS abilitato, la richiesta potrebbe essere effettuata come richiesta AJAX. Se l'endpoint "dominio di servizio" non ha CORS abilitato, il risultato finale di questa richiesta AJAX potrebbe effettivamente essere un'eco di auth_token / qualunque, invece di richiedere una seconda richiesta.
- Il client invia una richiesta CORS AJAX al "dominio di accesso", fornendo un URL sul "dominio del servizio"
- Il server di login restituisce una risposta HTTP Redirect (3XX) che include auth_token / failure / whatever nell'URL
- Il client segue il reindirizzamento al dominio del servizio.
- Il dominio del servizio restituisce un documento contenente tutte le informazioni fornite nell'URL (auth_token / qualunque).
In effetti, questo comportamento "echo the auth_token" potrebbe anche essere usato al posto della risorsa statica dalla sezione precedente, supportando quindi entrambi i modelli con lo stesso endpoint.