2014-07-13 4 views
20

Sono nuovo di OAuth2 e c'è un problema con cui mi sono confrontato e nonostante la ricerca non è ancora in grado di cogliere.In che modo le librerie JS lato client per OAuth2 mantengono l'autenticazione protetta?

La difficoltà di avere un client JS per OAuth2 è che non è possibile memorizzare il segreto del client, perché sarà ampiamente accessibile nel browser. Cioè nel this SO question il commento più quotati dice:

"Penso parametri tokenSecret e consumerSekret dovrebbero essere segreto Come potevano rimanere segreta quando vengono scaricati al browser !!!!?"

Quindi come si fa sul lato client framework OAuth2 come hello.js o oauth.io superare questo problema? So che usano un proxy sul lato server (che conosce l'ID e il segreto) per le loro richieste, ma il codice JS del client deve ancora in qualche modo dire al proxy chi è. Quindi cosa impedisce a nessuno di prendere il codice JS dal mio sito Web e parlare con il proxy per conto mio?

Ho anche trovato il Google APIs Client Library for JavaScript. AFAIK lì il codice cliente non passa un segreto. Ho capito correttamente che gestiscono questo avendo un indirizzo di risposta OAuth predefinito? (in modo che i token vengano sempre restituiti tramite un indirizzo HTTP predefinito). Quindi, anche se qualcuno tenta di impersonare il mio sito web utilizzando il mio ID, i token verranno comunque restituiti al mio sito web?

Forse sto confondendo alcuni argomenti diversi qui, qualsiasi luce sull'argomento sarebbe apprezzata.

risposta

14

Ci sono flussi in OAuth2 che non richiedono un segreto (ad esempio il flusso implicit viene in genere utilizzato per client basati su JS, SPAs, ecc.). Tuttavia, non tutti i provider supportano questo flusso, quindi in quelle situazioni è necessario un componente lato server che lo negozia per te e quindi gestisce le interazioni con il tuo front-end/dispositivo.

In ogni caso, è necessario che l'utente effettui l'autenticazione. Lo secret autentica il client (la tua app), non l'utente. L'url di ritorno (o callback) protegge il token da postare altrove (solo la tua app).

I campioni di questi flussi sono qui: https://docs.auth0.com/protocols#5

Aggiornamento: C'è un codice specifico/gettone protocollo di scambio per i "clienti pubblici" che aggiunge ulteriore sicurezza: PKCe (come funziona è qui: https://auth0.com/docs/protocols#oauth2-pkce-for-public-clients)

4

In caso di client JS, Google convalida che l'origine JS corrisponda a quella registrata con l'ID cliente. Quindi, se qualcuno usa l'id del client di qualcun altro, al massimo possono ottenere un token solo per gli account che possiedono (il che non sarà molto utile).

In generale, non si può mai sapere chi/quale client (o codice) sta parlando al proprio server. Vedi solo i dati che inviano. Quindi se gli stessi pacchetti vengono inviati da altri client/codice, non c'è nulla che tu possa fare e in generale non dovresti preoccuparti. Dovresti preoccuparti di avere le credenziali appropriate nella richiesta.

-3

L'intera confusione riguarda i parametri che dobbiamo ottenere per ottenere il token di accesso. Ho creato una piccola lib di codice. @ git potresti verificarlo.

https://github.com/dev-sandeep/oauth-js

var deferred = jQuery.ajax({ 
      url: '',//Access URL goes here 
      method: 'POST', 
      dataType: 'text', 
      data: { 
       scope: scope, //your scope 
       client_id: clientId,//client id 
       client_secret: clientSecretId,//client secret id 
       grant_type: 'client_credentials' 
      }, 
      headers: { 
       'Accept': 'application/json, application/x-www-form-urlencoded', 
       'Content-Type': 'application/x-www-form-urlencoded', 
      }, 
      complete: function (xhr, data) { 
       /* YOUR WORK STARTS HERE! */ 
       console.warn(xhr, data); 
      } 
     }); 
+2

per chiunque cerchi. Questo è estremamente insicuro. Chiunque può visualizzare la fonte e ottenere il segreto del cliente. Non farlo! – EasyCo

+0

Questo è molto insicuro. Chiunque può ottenere un token di accesso utilizzando il client secret. – ursuleacv

Problemi correlati