Come funziona l'accesso con accesso social per una parte relying di terze parti

3

Sto cercando di capire come aggiungere login e registrazione social a un servizio. Dopo aver letto molti post sui blog, molti mi hanno ricordato le insidie della progettazione di un tale sistema, del fatto che Oauth è per l'autorizzazione e non dell'autenticazione, la maggior parte scritta da persone che esplorano questo argomento mentre scrivono, tutti con opinioni diverse su cosa OpenID / OpenID connettono / etc è tutto, mi sto trovando più confuso di prima che iniziassi.

La mia comprensione è che con il Social Login il provider ID fa l'autenticazione. Quando l'utente è autenticato, il client (o l'agente utente) deve essere in possesso di qualcosa (un token sicuro?) Che indica che l'utente è riuscito a dimostrare la propria identità. Sulle successive richieste a / the / API, il server, che dal punto di vista del provider ID è di terze parti (chiamato relying party in alcuni documenti?) Dovrebbe essere in grado di verificare questo "token" e deve essere in grado di derivare da questo "token" che è l'utente reale.

Quindi, in termini pratici:

  • Che cosa riceverebbe l'API dal client quando un utente ha eseguito l'accesso utilizzando con accesso social?
  • Che cosa riceverà l'API dal client quando un utente si registra con accesso social?
  • Come minimo è necessario archiviare su ciascun utente a scopo di autenticazione (ID utente? Email per il ripristino / collegamento di più account? ID-provider (in quale formato?), Elenco delle sessioni correnti / date di scadenza? Ultimo tempo di accesso / aggiornamento forse? Che altro?)

Il sistema corrente (un'API completa REST) emette un token quando l'utente accede con email / password con un post a api.example.com/session . In questo caso l'API è in grado di verificare che l'utente abbia fornito le credenziali corrette.

Ho appreso che molti articoli online parlano solo di come utilizzare i token per consumare le risorse fornite da quella stessa organizzazione, ad esempio l'accesso a Facebook per il consumo delle API di Facebook. Questo potrebbe essere solo il mio malinteso però.

Alcune domande specifiche:

  • Che aspetto ha questo token? Rivela l'Identity Provider o come verificare la validità del token?
  • Il token fornisce al relying party (i server di backend API) un modo per ottenere, ad esempio, il nome completo o l'indirizzo e-mail dell'utente? O sarebbe la funzionalità delegata al Cliente?
  • Chi determina quali informazioni fornisce questo token: il provider ID o l'applicazione client?
  • Che dire del caso di un client Web in cui il client e lo user-agent non sono in esecuzione sullo stesso dispositivo? Il client o l'agente utente può "creare" un nuovo token che può essere utilizzato per firmare le richieste all'API e includere i dettagli importanti (ID utente, provider di ID, data di scadenza, ID cliente)?
  • L'endpoint "sessione" dell'API può essere esteso per gestire i token di "accesso social" o non è l'approccio corretto?
  • È importante identificare / autenticare il cliente? In tal caso, credo che i client mobili non possano archiviare in modo sicuro una chiave di firma!?

Una nota su oAuth e autorizzazione: non penso di aver bisogno di autorizzazione qui. L'API determina già se le richieste sono autorizzate in base all'utente identificato.

    
posta Johan 10.10.2016 - 12:13
fonte

1 risposta

3

Ti suggerisco di iniziare con alcuni dei corsi di Dominick Baier su Pluralsight . In particolare, potresti voler iniziare con il suo Introduzione a OAuth2, OpenID Connect e JSON Web Tokens (JWT) .

Se stai scrivendo servizi che richiedono che l'utente effettui il login ogni volta che lo usi, allora non penso che tu voglia utilizzare OAuth. Se stai scrivendo qualche tipo di app mobile o di servizio che deve successivamente accedere a questi servizi per conto dell'utente, allora sì, dovresti considerare OAuth. Come spiega Dominick Baier, le specifiche OAuth sono un po 'confuse e OpenID Connect lo è ancora di più.

Ti suggerisco di fare quanto segue:

  1. Utilizzare un "servizio token di sicurezza federato (STS)". Lo scopo di Federated STS è di rilasciare l'applicazione con token di autenticazione che contengono "attestazioni" che la tua applicazione comprende. Ad esempio, queste affermazioni potrebbero contenere l'indirizzo e-mail dell'utente, il nome completo, ecc., Qualunque cosa tu specifichi. Quando l'utente tenta di accedere ai servizi, viene reindirizzato a questo "STS federato" che offre all'utente le scelte su come desidera accedere (Facebook, Google, Live, LinkedIn, ecc.). L'utente quindi effettua l'accesso, l'STS federato riceve il token di autenticazione da Facebook o LinkedIn o qualsiasi altra cosa, trasforma il token e le sue attestazioni in un formato comprensibile dalla tua app e l'app consuma questo token di autenticazione ben fatto. Esistono numerosi servizi STS federati, tra cui Azure ACS, Azure Active Directory, ecc.
  2. Probabilmente vuoi che il token sia un token Web JSON (JWT). Nella configurazione del provider di identità federata, si specifica come si desidera "trasformare" le attestazioni in un formato comprensibile per l'applicazione. Ad esempio, se l'applicazione richiede un campo "Nome completo" e Facebook restituisce un campo "Nome" e "Cognome", è possibile indicare a Federated STS di convertire le informazioni di Facebook in un campo "Nome completo". Ecco un esempio di come appare un JWT:

    {   "sub": "1234567890",   "nome": "John Doe",   "admin": vero } ma puoi scegliere di avere i campi che desideri.

  3. Dopo che il client esegue l'accesso, viene autenticato e reindirizzato alla tua API, l'API riceverà generalmente un'intestazione HTTP con il token JWT, sebbene esistano altri schemi.

  4. È possibile configurare il servizio token federato in modo che restituisca anche il nome del provider di identità scelto dall'utente (Facebook, LinkedIn, ecc.)

  5. Non capisco completamente la tua domanda sul "client e user-agent" non in esecuzione, ma potresti voler guardare OAuth2 e "aggiornare i token" per questo.

  6. Sì, è molto importante autenticare il client.

  7. Piuttosto che estendere l'API per gestire diversi tipi di schemi di autenticazione e token, penso che dovresti usare lo schema che propongo in precedenza per scaricare tutta l'autenticazione su un "Federated Identity Provider / STS" in modo che il tuo codice sia non strettamente connesso all'autenticazione e in modo tale da poter aggiungere nuovi "Identity Providers" e "claims transformations" al Federated STS in futuro senza modifiche al codice.

risposta data 12.10.2016 - 23:18
fonte

Leggi altre domande sui tag