Questa è una situazione abbastanza comune in cui ti trovi in cui è una buona cosa in quanto significa che la soluzione è ben nota, discussa e testata.
- Is a simple signature verification by App2 is enough? Or there is a need that it sends the token to App1 for verification (there is a white list of public keys for App2) ?
Corretto, una verifica della firma "semplice" è tutto ciò che deve fare App2 per convalidare il token. Ciò garantirà a.) Il token è stato distribuito da App1 eb). Le attestazioni (coppie chiave-valore) nel token non sono state manomesse.
- I'm considering to add an expiration date for 30 mins, how should I handle refresh token at the client-side ?
Questo dipende più dalle preferenze personali, ma non mi piacciono i token di aggiornamento. I token di aggiornamento implicano una data di scadenza futura lontana (vale a dire un paio di giorni o una settimana) e possono essere molto dannosi se vengono rubati. Inoltre, secondo la mia esperienza, non esiste un modo veramente valido per memorizzare un segreto sul lato client. I cookie sono insicuri e non credo che i DB lato client siano molto migliori. È possibile crittografarlo con la password dell'utente, ma ciò richiede che l'utente re-digiti la password che sconfigge comunque lo scopo del token di aggiornamento, giusto? Quindi eviterei di aggiornare i token, se possibile.
- Instead of generation refresh tokens, is it secure to say that the access token is one-time only and App2 creates a session on the server-side (using the data in the token)?
Non vedo difetti in questo piano, penso che sia molto più sicuro che affidarsi a un token di aggiornamento. L'unica avvertenza qui è quella di garantire la possibilità di annullare un token di accesso su App1. Per altre parole, se eseguo l'autenticazione con App1, ottieni il mio token, poi vieni su App2, autentichi e ottieni il mio ID di sessione, sono felice. Ma un utente malintenzionato potrebbe rubare il mio token dal mio browser cookie. L'utente malintenzionato può utilizzare questo token per andare e ottenere la propria sessione con le mie credenziali su App2 a condizione che il token non sia ancora scaduto. Pertanto, App1 e App2 dovrebbero essere in grado di comunicare in questo scenario. App2 verifica che App1 affermi che il token non è ancora stato utilizzato. App2 lo utilizza, quindi indica a App1 che è stato utilizzato, annulla il token in modo che non possa essere riutilizzato in future richieste per generare un altro ID di sessione.
Come puoi vedere, diventa molto più complicato. Ma, se non lo fai, non utilizzi davvero gettoni una tantum. Un'alternativa potrebbe essere la scadenza del token MOLTO breve (ovvero cinque minuti o meno), tempo sufficiente per la reindirizzamento e l'autenticazione dell'utente con App2 e ottenere l'ID di sessione per l'autenticazione continua. Questa potrebbe essere la via più semplice, ma in realtà dipende dal livello di sicurezza che desideri raggiungere qui.
In ogni caso, l'ID sessione è un'idea intelligente. Ridurrà probabilmente il carico sul tuo server App2 in quanto non dovrà continuamente ricontrollare le firme dei token per ogni richiesta.