2013-01-10 12 views
40

In OAuth 1.0, 2-legged è abbastanza semplice: basta inviare la richiesta come al solito e omettere l'intestazione access_token.Come funziona Oauth a 2 vie in OAuth 2.0?

Le cose sembrano essere cambiate in OAuth 2.0 (drasticamente, come ho scoperto oggi :)). In OAuth 2.0, la richiesta non ha più intestazioni come il nonce, chiave dei consumatori, timestamp ecc Questo è solo sostituito dal seguente:

Authorization: OAuth ya29.4fgasdfafasdfdsaf3waffghfhfgh 

Capisco come 3 autorizzazioni zampe lavorano in OAuth 2.0 e flussi l'applicazione. Ma come funziona 2-legged in 2.0? È possibile progettare un'API in grado di supportare OAuth 2.0 a 2 e 3 vie?

Sono stato alla ricerca di informazioni su questo, ma ho trovato un sacco di cose su 2-gambe per 1.0 e quasi nulla per 2.0.

+3

d'accordo con te, ci sono abbastanza informazioni per oauth2 a 3 zampe o a due gambe oauth 1.0, ma quasi nulla per oauth 2.0 a due gambe. – skyfree

risposta

55

Dopo molte ricerche, ho scoperto che il tipo di sovvenzione client_credentials è per questo scenario. Una volta inserito questo termine in google, puoi trovare un sacco di risorse molto utili.

Questo è il flusso normale per OAuth 3 zampe 2.0 (vogliamo che l'utente per accedere):

Supponiamo di avere i seguenti punti finali nella nostra app per l'autenticazione:

/oauth/auth 

/oauth/token 

Normalmente (per codice di autorizzazione di sovvenzione), abbiamo indirizzare l'utente a /oauth/auth?state=blah&client_id=myid&redirecturl=mysite.com/blah

Poi dopo l'autenticazione, l'utente viene reindirizzato a mysite.com/blah?code=somecode

Otteniamo quindi somecode e lo scambiamo per un token utilizzando /oauth/token?code=somecode&client_id=myid&client_secret=mysecret

Possiamo quindi utilizzare il token per effettuare chiamate.


Questo è il flusso domanda di client_credentials per implementare 2 zampe OAuth 2.0, che è decisamente più semplice:

  • In questo approccio, non abbiamo bisogno di effettuare alcuna autenticazione.
  • Abbiamo semplicemente post per /oauth/token con i seguenti dati modulo:

    grant_type=client_credentials&scope=view_friends 
    

Si noti che la portata è opzionale. L'endpoint quindi restituisce direttamente un token di accesso da utilizzare (non viene fornito alcun token di aggiornamento). Poiché non viene fornito alcun token di aggiornamento, quando il token scade, sarà necessario riautenticarlo e richiederne uno nuovo.

Questo porta alle seguenti avvertenze:

  • utilizzare questo solo per (molto molto) applicazioni attendibili come le applicazioni interne.
  • È necessario il dispositivo a modo tuo per l'autenticazione. Ad esempio, lo RFC's example utilizza l'autenticazione di base.

Un'altra soluzione è utilizzare JWT (token Web JSON) come lo google OAuth API. È un processo molto complicato, ma esistono numerose librerie per generare il tuo JWT. È quindi inviare i seguenti dati del modulo (URL codificato, naturalmente):

grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion=generated_jwt 

Questo viene inviato alle /oauth/token per ottenere il token.


Per quanto riguarda la domanda di se è possibile creare un'API che supporta 2 zampe e 3 gambe OAuth 2.0, Sì, è possibile.

Quindi l'endpoint /auth viene utilizzato solo quando gli utenti devono autenticarsi con il servizio.

Nel /token endpoint, semplicemente controllare il valore di grant_type nei parametri GET per urn:ietf:params:oauth:grant-type:jwt-bearer se si utilizza JWT o client_credentials per client_credentials.

Si noti che durante la generazione di client_id e client_secret da fornire all'utente, se si supporta più grant_types, assicurarsi di disporre di una colonna del database per memorizzare il tipo di tipo di concessione per cui ID e segreto sono stati generati. Se è necessario disporre di più tipi di sovvenzione per utente, generare un diverso insieme di credenziali per ciascun tipo di sovvenzione.

+2

Se lo desideri, puoi anche controllare l'implementazione di Google. Ad esempio, l'esperienza dello sviluppatore è documentata qui: https://developers.google.com/drive/delegation E sì, fondamentalmente usando le credenziali del cliente e gli "account di servizio" speciali a cui è delegato l'accesso a livello di dominio. – Nivco

+1

Ciao Nivco, sto lavorando a un progetto relativo all'API di Google e non ho trovato abbastanza informazioni/conoscenze su oauth 2.0 a due vie. Il tuo link qui sopra aiuta davvero, tuttavia, la mia domanda è: che dire dell'API del calendario di Google, dell'API di Google Contacts e di IMAP XOAUTH di Gmail? Supportano oauth2 a due gambe? grazie – skyfree

+1

Per ulteriori informazioni sull'implementazione OAuth2 a due vie di Google, puoi anche consultare il seguente link: https: //developers.google.com/accounts/docs/OAuth2ServiceAccount. Inoltre, i token di accesso ottenuti tramite OAuth2 a due vie di Google sono supportati da tutte le API di Google (inclusi calendario, contatti, ecc.), Per ulteriori informazioni su questo indirizzo http://stackoverflow.com/questions/20127114/which-google- apis-support-OAuth2-domain-wide-delegazione/20.135.458 # 20.135.458. Spero che questo aiuti. –

1

È anche possibile verificare l'implementazione di Google di 2-legged OAuth2 (credo che questa documentazione sia stata pubblicata solo di recente).

Lo Google Drive SDK delegation docs dovrebbe anche aiutare a comprendere l'implementazione OAuth2 a due vie di Google.