Come convalidare un token di accesso OAuth 2.0 per un server di risorse?


147

Quando un client chiede a un server risorse di ottenere una risorsa protetta con un token di accesso OAuth 2.0, in che modo questo server convalida il token? Il protocollo token di aggiornamento OAuth 2.0?


Si suppone che il server sia in grado di convalidare il token emesso in precedenza ... Di solito si tratta di una ricerca del database o di una crittografia (token autofirmati).
Thilo,

Vedo. Che ne dici di questo caso, il proprietario della risorsa WS e il client WS sono entrambi su dispositivi di differenza?
Ack

5
Intendi il servizio di autenticazione e il servizio risorse? (il cliente / consumatore sarà sempre su un dispositivo diverso e non può validare i token da solo) In tal caso, è possibile utilizzare i token di aggiornamento che sono "costosi" per controllare (solo il server di autenticazione può farlo) ma di lunga durata e token di accesso che scadono frequentemente e possono essere controllati offline.
Thilo,

Risposte:


97

Aggiornamento novembre 2015: secondo Hans Z. di seguito - questo è ora definito come parte di RFC 7662 .

Risposta originale: le specifiche OAuth 2.0 ( RFC 6749 ) non definiscono chiaramente l'interazione tra un server risorse (RS) e un server di autorizzazione (AS) per la convalida del token di accesso (AT). Dipende molto dal formato / strategia del token dell'AS - alcuni token sono autonomi (come i token Web JSON ) mentre altri possono essere simili a un cookie di sessione in quanto fanno riferimento a informazioni conservate sul lato server nell'AS.

Nel gruppo di lavoro OAuth si è discusso della creazione di un modo standard per una RS di comunicare con l'AS per la convalida AT. La mia azienda (Ping Identity) ha messo a punto un approccio di questo tipo per il nostro commerciale OAuth AS (PingFederate): https://support.pingidentity.com/s/document-item?bundleId=pingfederate-93&topicId=lzn1564003025072.html#lzn1564003025072__section_N10578_N1002A_N10001 . Usa l'interazione basata su REST per questo che è molto complementare a OAuth 2.0.


Scott T, c'è un modo per vedere un esempio di codice su come utilizzare la funzionalità in Ping Federate?
JavaHead,

2
@JavaHead ci sono altri dettagli sul protocollo coperti sul nostro sito web per sviluppatori qui: developer.pingidentity.com/it/resources/… , il campo da gioco OAuth PingFederate viene fornito come un insieme di JSP a cui è possibile fare riferimento come codice sorgente per i token di convalida. Esso (e altre librerie ed esempi open source) può essere scaricato da qui: developer.pingidentity.com/it/code.html
Scott T.

Scott, sto cercando un esempio che mostri la concessione delle credenziali del client con API Rest protetta da un server di risorse locale e PingFederate come server di autenticazione. Il server delle risorse locale chiamerà quindi l'endpoint di convalida. Ti sei mai imbattuto in qualcosa del genere?
Giava,

@JavaHead è di nuovo qualcosa per cui dovresti essere in grado di fare riferimento al parco giochi OAuth di PingFederate. Dimostra sia il tipo di concessione delle credenziali del client sia la convalida di un token di accesso da parte di un server di risorse.
Scott T.

Nel caso di un token di accesso JWT, suppongo che in genere non si desideri colpire l'endpoint di introspezione AS per ogni richiesta in arrivo a RS. In tal caso, un controllo RS della firma e dell'ambito del token è sufficiente? O forse la RS potrebbe memorizzare nella cache le risposte di introspezione dall'AS per un certo periodo di tempo?
Gary,

119

Google way

Convalida token di Google Oauth2

Richiesta:

https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=1/fFBGRNJru1FQd44AzqT3Zg

Rispondere:

{
  "audience":"8819981768.apps.googleusercontent.com",
  "user_id":"123456789",
  "scope":"https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email",
  "expires_in":436
} 

Microsoft Way

Microsoft - Oauth2 controlla un'autorizzazione

Modo di Github

Github - Oauth2 controlla un'autorizzazione

Richiesta:

GET /applications/:client_id/tokens/:access_token

Rispondere:

{
  "id": 1,
  "url": "https://api.github.com/authorizations/1",
  "scopes": [
    "public_repo"
  ],
  "token": "abc123",
  "app": {
    "url": "http://my-github-app.com",
    "name": "my github app",
    "client_id": "abcde12345fghij67890"
  },
  "note": "optional note",
  "note_url": "http://optional/note/url",
  "updated_at": "2011-09-06T20:39:23Z",
  "created_at": "2011-09-06T17:26:27Z",
  "user": {
    "login": "octocat",
    "id": 1,
    "avatar_url": "https://github.com/images/error/octocat_happy.gif",
    "gravatar_id": "somehexcode",
    "url": "https://api.github.com/users/octocat"
  }
}

Via dell'Amazzonia

Accedi con Amazon - Guida per gli sviluppatori (dicembre 2015, pagina 21)

Richiesta :

https://api.amazon.com/auth/O2/tokeninfo?access_token=Atza|IQEBLjAsAhRmHjNgHpi0U-Dme37rR6CuUpSR...

Risposta:

HTTP/l.l 200 OK
Date: Fri, 3l May 20l3 23:22:l0 GMT 
x-amzn-RequestId: eb5be423-ca48-lle2-84ad-5775f45l4b09 
Content-Type: application/json 
Content-Length: 247 

{ 
  "iss":"https://www.amazon.com", 
  "user_id": "amznl.account.K2LI23KL2LK2", 
  "aud": "amznl.oa2-client.ASFWDFBRN", 
  "app_id": "amznl.application.436457DFHDH", 
  "exp": 3597, 
  "iat": l3ll280970
}

2
@gustavodiazjaimes Non spiega affatto come il lato server riconosce l'ID utente assegnato da un token.
user2284570

22
Non capisco tutti i voti positivi. Questo non sembra rispondere alla domanda.
Duncan Jones,

Qualcuno sa se Azure Active Directory ha un endpoint simile per verificare se un token emesso è valido?
user180940,

2
In altre parole, fai il tuo.
AndroidDev

51

Un aggiornamento sulla risposta di @Scott T.: l'interfaccia tra Resource Server e Authorization Server per la convalida dei token è stata standardizzata in IETF RFC 7662 nell'ottobre 2015, vedere: https://tools.ietf.org/html/rfc7662 . Una chiamata di convalida di esempio sarebbe simile a:

POST /introspect HTTP/1.1
Host: server.example.com
Accept: application/json
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer 23410913-abewfq.123483

token=2YotnFZFEjr1zCsicMWpAA

e una risposta di esempio:

HTTP/1.1 200 OK
Content-Type: application/json

{
  "active": true,
  "client_id": "l238j323ds-23ij4",
  "username": "jdoe",
  "scope": "read write dolphin",
  "sub": "Z5O3upPC88QrAjx00dis",
  "aud": "https://protected.example.net/resource",
  "iss": "https://server.example.com/",
  "exp": 1419356238,
  "iat": 1419350238,
  "extension_field": "twenty-seven"
}

Naturalmente l'adozione da parte di venditori e prodotti dovrà avvenire nel tempo.


Se usare OoenId Connect non dovremmo preferire il modo openid di usare il token ID per convalidare il token di accesso: openid.net/specs/…
adnan kamili

1
@Renan: essere in linea con il modo in cui gli ambiti vengono richiesti in una richiesta di autorizzazione, ovvero con un scopeparametro di query il cui valore contiene un elenco di ambiti separati da spazi
Hans Z.

4
Si prega di non usare la parola "standardizzato" quando qualcosa non è stato ufficialmente accettato da un ente governativo. IETF RFC 7662 a partire da febbraio 2018 indica chiaramente che si tratta di una "proposta".
AndroidDev

1
@adnankamili Non esiste una "proposta". Quando un documento diventa un RFC è già uno "standard proposto" che ha un peso significativo dietro di esso. OAuth 2.0 stesso è ancora uno "standard proposto", quindi non sono sicuro di ciò che stai cercando di fare.
Pace

15

Le specifiche OAuth 2.0 non definiscono la parte. Ma potrebbero esserci un paio di opzioni:

  1. Quando il server delle risorse ottiene il token nell'intestazione Authz, chiama l'API validate / introspect sul server Authz per convalidare il token. Qui il server Authz potrebbe convalidarlo utilizzando DB Store o verificando la firma e alcuni attributi. Come parte della risposta, decodifica il token e invia i dati effettivi del token insieme al tempo di scadenza rimanente.

  2. Authz Server può crittografare / firmare il token utilizzando la chiave privata e quindi publickey / cert può essere assegnato a Resource Server. Quando il server delle risorse ottiene il token, decodifica / verifica la firma per verificare il token. Elimina il contenuto ed elabora il token. Quindi può fornire accesso o rifiutare.


8

Le specifiche di OAuth v2 indicano:

Gli attributi del token di accesso e i metodi utilizzati per accedere alle risorse protette esulano dallo scopo di questa specifica e sono definiti dalle specifiche del compagno.

Il mio server di autorizzazione ha un endpoint del servizio Web (SOAP) che consente al server di risorse di sapere se access_token è valido.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.