Stiamo utilizzando le credenziali di risorse-proprietario rilascio (con oauth2:password
in security-config.xml
Giochiamo fuori questo scenario per spiegare la mia situazione:.Utilizzando Spring Security OAuth2, qual è il modo giusto per aggiornare l'autenticazione memorizzata nel TokenStore?
- Bob è stato creato con le autorità
ROLE_USER
- Bob cerca di accedere a un OAuth2 protetta risorsa
- Bob utilizza l'applicazione mobile ufficiale per accedervi, in modo che le credenziali del client siano corrette
- token di accesso di Bob viene creato e memorizzato nel
TokenStore
, digitato sul suousername
,client_id
escope
. (vedi DefaultAuthenticationKeyGenerator.java) - Il telefono di Bob tenta di chiamare i servizi protetti con questo token di accesso, ma tali servizi richiedono agli utenti di disporre di un
authority
ROLE_MOBILE_USER
. - Bob contatta il proprietario db e ha aggiunto
ROLE_MOBLE_USER
al suo utente nel database. - Bob tenta di ottenere un altro token di accesso, ma lo
DefaultTokenServices
restituisce lo stesso token di accesso non funzionante. - L'unico modo per sfruttare il suo nuovo
authority
è attendere fino a quando il suo vecchio token di accesso scade, in modo che possa ottenere un nuovo token di accesso con ilauthority
corretto.
Ci sono diversi modi per risolvere questo problema.
Per uno, l'app di amministrazione che aggiunge ROLE_MOBILE_USER
alle autorità di Bob potrebbe quindi cancellare tutti i token di accesso e le autorizzazioni nel database. In questo modo lo DefaultTokenServices
ne creerà solo uno nuovo con le autorizzazioni corrette serializzate come la sua nuova OAuth2Authentication. Tuttavia, potremmo non volere che la webapp di amministrazione riguardi OAuth a questo punto (almeno non ancora). Se possibile, vorremmo mantenere le preoccupazioni delle app di amministrazione il più concisa possibile, e al momento non ci sono dipendenze da oauth.
Ci potrebbe esporre il metodo DELETE
al /oauth/access_token
endpoint e dire l'applicazione mobile per provare a cancellare quel token di accesso e ri-richiesta di uno, nel caso in cui la stored authorities
sono stantio. Questo sembra più un work-around però.
Infine, è possibile serializzare lo authorities
nel proprio numero definito AuthenticationKeyGenerator
. In pratica, utilizza lo username
, client_id
, scope
e authorities
dell'autorizzazione ed esegue lo stesso algoritmo di digest su di essi. In questo modo, quando Bob tenta di accedere, otterrà lo stesso token di accesso, ma l'archivio di token sottostante riconoscerà che ha un'autenticazione diversa (dal gestore di autenticazione nel token granter bean) e aggiorna il suo database. Il problema che ho con questa soluzione è che si basa semplicemente sul comportamento di implementazione dell'archivio dei token sottostante (sebbene sia il InMemoryTokenStore
sia lo JdbcTokenStore
si comportino in questo modo).
Riesci a pensare a soluzioni migliori/più pulite? Sto pensando troppo a questo?
Grazie in anticipo.
aggiungo che a questo punto usato il 'AuthenticationKeyGenerator' personalizzato e le cose funzionavano correttamente. Desidero ancora una soluzione migliore/più pulita, poiché la chiave viene controllata solo quando al server di autorizzazione viene richiesto un nuovo token, ma il server delle risorse potrebbe ancora utilizzare le vecchie autorizzazioni. – Joe
Ti stai ancora aggrappando a questa soluzione o hai trovato un modo migliore per affrontare il problema? Ho esattamente lo stesso problema adesso e non sono sicuro di come affrontarlo. – rpvilao
Siamo rimasti fedeli a questa soluzione e finora non abbiamo riscontrato problemi. Raccomanderei comunque la prima soluzione e accetto che la modifica dell'autorizzazione di un utente richieda di toccare il database dei token oauth. – Joe