MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Qual è il modo migliore per autenticare e autorizzare una soluzione Web e API come MERN Stack?

La migliore strategia di autorizzazione dipende dall'ambito delle tue applicazioni a breve o lungo termine.

Web monolitico o semplice con accesso privato

Ad esempio, se avrai solo un semplice Web (MERN) con un semplice backend (api rest) o un'applicazione monolitica come questa esempio di mern con un accesso interno o privato nella tua organizzazione, la tua strategia di autorizzazione potrebbe essere semplice come :

  • (1*) /login express route che riceve user/password, li convalida nel database e restituisce il classico token jwt e un array di opzioni (react route) a cui l'utente dovrebbe avere accesso
  • l'app web (react) deve visualizzare le pagine i cui percorsi corrispondono ai percorsi ricevuti
  • l'app Web deve inviare il token ricevuto a qualsiasi chiamata dell'endpoint di riposo API
  • quando l'API riceve l'invocazione da react web, deve convalidare l'esistenza del token come intestazione. Se non esiste, deve restituire un errore 403.
  • (2*) Se il token esiste, deve provare a convalidarlo (ben formato, non scaduto, firma corretta, ecc.).
  • (3*)Se si tratta di un token valido, è necessario eseguire un'ultima convalida:L'utente con ruolo "guest" è autorizzato a eseguire un DELETE a un endpoint /user/100 .
  • (4*) La soluzione classica consiste nell'avere alcune tabelle nel database come:utente, ruoli, ruoli_utente, autorizzazione_ruolo, opzione_autorizzazione. La tabella delle opzioni deve aver registrato tutti gli endpoint API e il relativo metodo. Anche questo potrebbe essere utilizzato per creare la relazione tra gli utenti <:> percorsi web. Controlla questo

Requisiti moderni

Le organizzazioni moderne e di grandi dimensioni richiedono:

  • Accessi ai social network
  • Utenti interni/esterni
  • Accessi non interattivi (robot, scheduler, ecc.)
  • Diverse app web
  • Diverse app mobili
  • Tanto riposo Api

In questo caso, l'app MERN non è una buona scelta perché è ALL-IN-ONE. La strategia comune per implementare i requisiti precedenti consiste nell'avere diversi artefatti distribuiti in diversi server:

  • app web (react, vue, angular, linkstart, ecc.)
  • apis rest (nodejs + expres, java, python, ecc.)
  • Autenticazione/autorizzazione:piattaforma/provider oauth2, piattaforme di identità/accesso, ecc

Se questo è il tuo caso, devi dividere la tua app MERN in diversi artefatti distribuibili:web, API e sicurezza.

Auth2

Non importa se sei preoccupato solo per l'accesso o come garantire l'autenticazione e l'autorizzazione per i tuoi siti Web, API e forse le tue app mobili, avrai bisogno di:OAUTH2

Potresti sviluppare la tua piattaforma di sicurezza prendendo in considerazione (1*), (2*), (3*) e (4*) o usare qualcosa come:

  • autorizzazione0
  • portachiavi, ecc.

Maggiori dettagli qui:https://stackoverflow.com/a/62049409

Le tue domande

  • quale metodo pensi sia migliore?
    • Penso che se utilizzerai auth0, risparmierai tempo e fatica. Con auth0 hai solo bisogno di una semplice app express, con alcuni endpoint come /login, /callback, ecc. Oppure, se usi auth0 + passport.js, questi endpoint sono gestiti da passport.js
    • Ti consiglio di rivedere come funziona il flusso OAUTH2 prima di utilizzare auth0 con/senza passaporto. Questo link mi ha aiutato molto.
  • Qual ​​è la differenza tra 2 e 3,
    • Come ho letto, auth0 e altre piattaforme offrono un servizio di gestione degli utenti o possono connettersi al servizio degli utenti (AD/LDAP, database, API, ecc.). Quindi
  • C'è un modo per implementare le regole nel passaporto (ad es. reindirizzare nuovi utenti al primo accesso)
    • Sì. Puoi aggiungere un po' di logica quando il callback viene reindirizzato nei tuoi nodejs con o senza passaporto.
  • Se implemento Passport con MongoDB e il mio database ha centinaia di utenti, come posso gestirli?
    • Oggi il database supporta molte righe. Quindi per il tuo database di produzione prova a ottimizzarlo o monitorarlo. Un'altra opzione è assumere un amministratore di database per eseguire queste attività.

Riferimenti