user-agent oauth2 - Qual è lo scopo del tipo di autorizzazione di concessione implicita in OAuth 2?




authorization code (9)

Non sono sicuro di aver capito correttamente la risposta e il commento di Dan. Mi sembra che la risposta abbia dichiarato alcuni fatti corretti, ma indica esattamente che cosa ha chiesto OP. Se capisco correttamente, il vantaggio principale del flusso di concessione implicito è che un client come l'app JS (ad esempio l'estensione di Chrome) non deve esporre il segreto del client.

Dan Taflin ha detto:

... nel flusso del codice di autorizzazione il proprietario della risorsa non ha mai bisogno di vedere il token di accesso, mentre nei client javascript è inevitabile. Il segreto del client potrebbe ancora essere mantenuto dai client javascript utilizzando il flusso del codice di autorizzazione, tuttavia ..

Forse ti ho frainteso, ma il client (app JS in questo caso) deve passare le credenziali del client (chiave e segreto del client) al server delle risorse nel flusso del codice di autorizzazione, giusto? Il segreto del cliente non può essere "tenuto da JS".

Non so se ho una specie di punto cieco o cosa, ma ho letto le specifiche di OAuth 2 molte volte e ho esaminato gli archivi della mailing list, e devo ancora trovare una buona spiegazione del perché la Sovvenzione implicita flusso per ottenere i token di accesso è stato sviluppato. Rispetto alla concessione del codice di autorizzazione, sembra rinunciare all'autenticazione del client senza un motivo molto convincente. In che modo questo "è ottimizzato per i client implementati in un browser che utilizza un linguaggio di scripting" (per citare le specifiche)?

Entrambi i flussi iniziano allo stesso modo (fonte: http://tools.ietf.org/html/draft-ietf-oauth-v2-22 ):

  1. Il client avvia il flusso indirizzando lo user-agent del proprietario della risorsa sull'endpoint di autorizzazione.
  2. Il server di autorizzazione autentica il proprietario della risorsa (tramite l'utente-agente) e stabilisce se il proprietario della risorsa concede o nega la richiesta di accesso del client.
  3. Supponendo che il proprietario della risorsa conceda l'accesso, il server di autorizzazione reindirizza l'utente-agente al client utilizzando l'URI di reindirizzamento fornito in precedenza (nella richiesta o durante la registrazione del client).
    • L'URI di reindirizzamento include un codice di autorizzazione (flusso del codice di autorizzazione)
    • L'URI di reindirizzamento include il token di accesso nel frammento URI (Flusso implicito)

Ecco dove si dividono i flussi. In entrambi i casi l'URI di reindirizzamento a questo punto è relativo ad un endpoint ospitato dal client:

  • Nel flusso del codice di autorizzazione, quando l'agente utente raggiunge quell'endpoint con il codice di autorizzazione nell'URI, il codice su quell'endpoint scambia il codice di autorizzazione con le sue credenziali client per un token di accesso che può quindi utilizzare secondo necessità. Potrebbe, ad esempio, scriverlo in una pagina Web a cui potrebbe accedere uno script nella pagina.
  • Il flusso implicito ignora completamente questo passaggio di autenticazione del client e carica solo una pagina Web con script client. C'è un trucco carino qui con il frammento di URL che impedisce al token di accesso di essere passato troppo spesso, ma il risultato finale è essenzialmente lo stesso: il sito ospitato dal client serve una pagina con qualche script in esso che può afferrare il token di accesso .

Da qui la mia domanda: cosa è stato ottenuto qui saltando la fase di autenticazione del client?


https://tools.ietf.org/html/rfc6749#page-8

Implicito

La concessione implicita è un flusso di codice di autorizzazione semplificato ottimizzato per i client implementati in un browser che utilizza un linguaggio di scripting come JavaScript. Nel flusso implicito, invece di emettere un codice di autorizzazione al client, il client riceve direttamente un token di accesso (come risultato dell'autorizzazione del proprietario della risorsa). Il tipo di concessione è implicito, poiché non vengono emesse credenziali intermedie (come un codice di autorizzazione) (e successivamente utilizzate per ottenere un token di accesso).

Quando si emette un token di accesso durante il flusso di finanziamento implicito, il
il server di autorizzazione non autentica il client. In qualche
casi, l'identità del cliente può essere verificata tramite l'URI di reindirizzamento
utilizzato per consegnare il token di accesso al client. Il token di accesso può essere esposto al proprietario della risorsa o ad altre applicazioni con accesso allo user-agent del proprietario della risorsa.

Le sovvenzioni implicite migliorano la reattività e l'efficienza di alcuni
client (come un client implementato come applicazione nel browser),
poiché riduce il numero di round trip necessari per ottenere un
token di accesso.


oltre alle altre risposte è anche importante rendersi conto che il profilo implicito consente un flusso del solo canale anteriore rispetto al flusso del codice di autorizzazione che richiede una richiamata al server di autorizzazione; questo diventa evidente in OpenID Connect, che è un protocollo SSO costruito su Auth 2.0 dove il flusso implicito è simile al binding SAML POST piuttosto popolare e il flusso del codice di autorizzazione è simile al binding dell'artifact SAML meno diffuso


Si riduce a: Se un utente esegue un'app Web basata su browser o "pubblica" (JavaScript) senza componente lato server, l'utente si fida implicitamente dell'app (e del browser in cui viene eseguita, potenzialmente con altri browser basate su app ...).

Non esiste un server remoto di terze parti, solo il server delle risorse. Non vi è alcun vantaggio per un codice di autorizzazione, in quanto non esiste nessun altro agente oltre al browser che agisce per conto dell'utente. Non vi è alcun vantaggio per le credenziali del cliente per lo stesso motivo. ( Qualsiasi cliente può tentare di utilizzare questo flusso.)

Le implicazioni sulla sicurezza, tuttavia, sono significative. Da http://tools.ietf.org/html/rfc6749#section-10.3 :

Quando si utilizza il tipo di concessione implicita, il token di accesso viene trasmesso nel frammento URI, che può esporlo a parti non autorizzate.

Da http://tools.ietf.org/html/rfc6749#section-10.16 :

Un proprietario di risorse può delegare volontariamente l'accesso a una risorsa concedendo un token di accesso al client malintenzionato di un utente malintenzionato. Ciò potrebbe essere dovuto a phishing o ad altri pretesti ...


La solita spiegazione è che la concessione implicita è più facile da implementare quando si utilizza un client JavaScript. Ma penso che questo sia il modo sbagliato di guardarlo. Se stai utilizzando un client JavaScript che richiede risorse protette direttamente tramite XMLHttpRequest, la concessione implicita è l'unica opzione, sebbene sia meno sicura.

La concessione del codice di autorizzazione fornisce ulteriore sicurezza, ma funziona solo quando si dispone di un server Web che richiede le risorse protette. Poiché il server Web può memorizzare il token di accesso, si corre meno rischi che il token di accesso venga esposto a Internet e si può emettere un token che dura a lungo. E poiché il server web è affidabile, può ricevere un "token di aggiornamento", in modo che possa ottenere un nuovo token di accesso quando scade quello vecchio.

Ma - e questo è un punto che è facile non notare - la sicurezza del flusso del codice di autorizzazione funziona solo se il server Web è protetto da una sessione, stabilita con l'autenticazione dell'utente (accesso). Senza una sessione, un utente non fidato potrebbe semplicemente effettuare richieste al server web, utilizzando l'id client, e sarebbe lo stesso come se l'utente avesse il token di accesso. L'aggiunta di una sessione significa che solo un utente autenticato può accedere alle risorse protette. Il client_id è solo l '"identità" della webapp JS, non l'autenticazione di detta webapp.

Significa anche che puoi terminare la sessione prima che il token OAuth scada. Non esiste un modo standard per invalidare un token di accesso. Ma se la tua sessione scade, il token di accesso è inutile, dal momento che nessuno lo sa, ma il server web. Se un utente non fidato ha ottenuto l'accesso alla chiave di sessione, sarà in grado di accedere alle risorse protette solo fino a quando la sessione è valida.

Se non c'è un server web, è necessario utilizzare la concessione implicita. Ma questo significa che il token di accesso è esposto a Internet. Se un utente non fidato vi accede, possono usarlo fino alla scadenza. Ciò significa che avranno accesso ad esso più a lungo che con una sovvenzione di codice di autorizzazione. Pertanto, potrebbe essere necessario prendere in considerazione l'eventualità di far scadere il token e evitare l'accesso a risorse più sensibili.


È lì per motivi di sicurezza, non per semplicità.

È necessario considerare la differenza tra l' agente utente e il client :

L'user-agent è il software con cui l'utente ("proprietario della risorsa") comunica con altre parti del sistema (server di autenticazione e server delle risorse).

Il client è il software che vuole accedere alle risorse dell'utente sul server delle risorse.

Nel caso di utente-agente disaccoppiato e client, la concessione del codice di autorizzazione ha senso. Ad esempio, l'utente utilizza un browser Web (user-agent) per accedere con il proprio account Facebook su Kickstarter. In questo caso il client è uno dei server di Kickstarter, che gestisce gli accessi dell'utente. Questo server riceve il token di accesso e il token di aggiornamento da Facebook. Pertanto, questo tipo di client considerato "sicuro", a causa dell'accesso limitato, i token possono essere salvati e Kickstarter può accedere alle risorse degli utenti e persino aggiornare i token di accesso senza l'interazione dell'utente.

Se l'agente utente e il client sono accoppiati (ad es. Applicazione mobile nativa, applicazione javascript), può essere applicato il Flusso di lavoro di autorizzazione implicita . Si basa sulla presenza del proprietario della risorsa (per l'immissione delle credenziali) e non supporta i token di aggiornamento. Se questo client memorizza il token di accesso per un uso successivo, si verificherà un problema di sicurezza, poiché il token può essere facilmente estratto da altre applicazioni o utenti del client. L'assenza del token di aggiornamento è un ulteriore suggerimento, che questo metodo non è progettato per l'accesso alle risorse dell'utente in assenza dell'utente.


Nel flusso implicito se il browser dell'utente è corrotto (estensione / virus malvagio), la corruzione ottiene l'accesso alle risorse dell'utente e può fare cose cattive.

Nel flusso auth la corruzione non può perché non conosce il segreto del client.


Penso che Will Cain abbia risposto a questa domanda dicendo "Non c'è alcun vantaggio per le credenziali del cliente per lo stesso motivo. (Qualsiasi client può tentare di utilizzare questo flusso.)" Inoltre considera redirect_uri per il flusso implicito forse "localhost" - nessuna richiamata viene creato dal server di autorizzazione per il flusso implicito. Poiché non c'è modo di pre-fidarsi del client, l'utente dovrebbe approvare il rilascio delle attestazioni dell'utente.


Non usare questa soluzione alternativa nella produzione! Usare solo per scopi di sviluppo

Ho trovato una risposta, è necessario disabilitare la verifica SSL:

// create curl resource
$ch = curl_init();

// set url
curl_setopt($ch, CURLOPT_URL, $url);
//return the transfer as a string
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);

// $output contains the output string
$output = curl_exec($ch);
if ( ! $output) {
    print curl_errno($ch) .': '. curl_error($ch);
}

// close curl resource to free up system resources
curl_close($ch);

return $output;

e funziona bene! Ringrazia tutti :)