sql >> Database >  >> NoSQL >> MongoDB

Wat is de beste manier om een ​​web- en API-oplossing zoals MERN Stack te authenticeren en autoriseren?

De beste autorisatiestrategie hangt af van de omvang van uw toepassingen op korte of lange termijn.

Monolitisch of eenvoudig web met privéaanmelding

Als je bijvoorbeeld een simpel (MERN) web hebt met een simpele backend (api rest) of een monolithische applicatie zoals deze mern voorbeeld met een interne of privé login in uw organisatie, kan uw autorisatiestrategie zo simpel zijn als:

  • (1*) /login express route die gebruiker/wachtwoord ontvangt, valideert in database en retourneert het klassieke jwt-token en een reeks opties (reageerroutes) waartoe de gebruiker toegang zou moeten hebben
  • webapp (reageren) moet pagina's weergeven waarvan de routes overeenkomen met de ontvangen routes
  • webapp moet het ontvangen token naar elke api-rest-eindpuntaanroep sturen
  • wanneer api de aanroep van react web ontvangt, moet het bestaan ​​van token als header worden gevalideerd. Indien niet aanwezig, moet een 403-fout worden geretourneerd.
  • (2*) Als een token bestaat, moet u proberen deze te valideren (goed gevormd, niet verlopen, correcte handtekening, enz.).
  • (3*)Als het een geldig token is, moet u een laatste validatie uitvoeren:Mag de gebruiker met de rol "gast" een DELETE uitvoeren naar een eindpunt /user/100 .
  • (4*) Klassieke oplossing is om enkele tabellen in uw database te hebben, zoals:gebruiker, rollen, gebruikersrollen, rolpermissie, machtigingsoptie. De optietabel moet al uw api-eindpunten en de bijbehorende methode hebben geregistreerd. Dit zou ook kunnen worden gebruikt om de relatie tussen gebruikers <:> webroutes te maken. Controleer dit

Moderne vereisten

Moderne en grote organisaties vereisen:

  • Aanmeldingen voor sociale netwerken
  • Interne/externe gebruikers
  • Geen interactieve aanmeldingen (robots, planners, enz.)
  • Verschillende web-apps
  • Verschillende mobiele apps
  • Veel API-rust

In dit geval is de MERN-app geen goede keuze omdat het ALL-IN-ONE is. Een algemene strategie om de vorige vereisten te implementeren, is om verschillende artefacten op verschillende servers te implementeren:

  • web-app (react, vue, angular, linkstart, etc)
  • apis-rust (nodejs + expres, java, python, enz.)
  • authenticatie/autorisatie:oauth2-platform/provider, identiteits-/toegangsplatforms, enz.

Als dit uw geval is, moet u uw MERN-app opsplitsen in verschillende inzetbare artefacten:web, api en beveiliging.

Oauth2

Het maakt niet uit of u zich alleen zorgen maakt om in te loggen of om de authenticatie en autorisatie voor uw web, api's en misschien uw mobiele apps te verzekeren, u heeft nodig:OAUTH2

U kunt uw eigen beveiligingsplatform ontwikkelen, rekening houdend met (1*), (2*), (3*) y (4*) of iets gebruiken als:

  • auth0
  • sleutelhanger, enz.

Meer details hier:https://stackoverflow.com/a/62049409

Uw vragen

  • welke methode is volgens jou beter?
    • Ik denk dat als je auth0 gebruikt, je tijd en moeite bespaart. Met auth0 heb je alleen een eenvoudige express-app nodig, met enkele eindpunten zoals /login, /callback, enz. Of als je auth0 + paspoort.js gebruikt, worden deze eindpunten beheerd door paspoort.js
    • Ik raad je aan om eerst te kijken hoe de OAUTH2-stroom werkt voordat je auth0 met/zonder paspoort gebruikt. Deze link heeft me erg geholpen.
  • Wat is het verschil tussen 2 en 3,
    • Zoals ik lees, bieden auth0 en andere platforms een gebruikersbeheerservice of het kan verbinding maken met uw gebruikersservice (AD/LDAP, database, api, enz.). Dus
  • Is er een manier om regels in het paspoort te implementeren (bijv. nieuwe gebruikers omleiden bij de eerste keer inloggen)
    • Ja. Je kunt wat logica toevoegen wanneer terugbellen wordt omgeleid in je nodejs met of zonder paspoort.
  • Als ik Passport implementeer met MongoDB en mijn database honderden gebruikers heeft, hoe kan ik ze dan beheren?
    • De database van tegenwoordig ondersteunt veel rijen. Probeer dus voor uw productiedatabase deze te optimaliseren of te monitoren. Een andere optie is om een ​​databasebeheerder in te huren om deze taken uit te voeren.

Referenties




  1. Maak verbinding met meerdere mongo db-hosts en authenticeer met behulp van een andere database in spring boot

  2. Omgekeerde paginering via een opnieuw gesorteerde set

  3. Hoe zorg je voor een uniek item in een array op basis van specifieke velden - mongoDB?

  4. Hoe de featureCompatibilityVersion in MongoDB in te stellen