Как использовать Passport JS in Express с параметрами маршрутизации? - PullRequest
1 голос
/ 20 марта 2020

В настоящее время я работаю над веб-приложением на базе Node и Express (JS) и MongoDB для моего проекта в последний год. Я учусь и в то же время пытаюсь реализовать различные функции. У меня длинная кривая обучения. Буду признателен, если принять это во внимание.

Я пытался создать Профили пользователей только для всех зарегистрированных пользователей.

То, что я пытаюсь сделать достижения:

1) Когда кто-то использует параметры маршрутизации, такие как:

app.get("/users/:username", function(req,res) {
  //Code
});

Я хочу, чтобы запрос был успешным, только если аутентифицирован пользователь - Паспорт JS (локальная стратегия).

2) Если они только пытаются попасть по пути / user - тогда он должен показываться неавторизованным.

3) Когда они входят в систему, она должна показать им страницу по пути - / users / {username} / map

Примечание. Карта - это просто другой файл .e js.

PS Я пробовал различные методы, но здесь невозможно перечислить их все, ниже приведен мой текущий код:

//jshint esversion:6
require('dotenv').config()
const express = require("express");
const bodyParser = require("body-parser");
const ejs = require("ejs");
const app = express();
const mongoose = require("mongoose");
const encrypt = require("mongoose-encryption");

//For Sessions and Cookies
const session = require("express-session");
const passport = require("passport");
const passportLocalMongoose = require("passport-local-mongoose");


app.use(express.static("public"));
app.set('view engine', 'ejs');
app.use(bodyParser.urlencoded({
  extended:true
}));


//Initializing Sessions
app.use(session({
  secret: "Hrishikesh",
  resave: false,
  saveUninitialized: false
}));

//Initializing Passport
app.use(passport.initialize());

//Using Passport to deal with sessions
app.use(passport.session());

mongoose.connect("mongodb://localhost:27017/dunzoUserDB" , { useUnifiedTopology: true , useNewUrlParser: true });
mongoose.set("useCreateIndex", true);

//Schema for Users
const userSchema = new mongoose.Schema({
  email: String,
  password: String,
  username: String
});

//Passport-local-mongoose ----> To be modified in Schema
userSchema.plugin(passportLocalMongoose); //Used to hash & salt password and also to save our Users into our MongoDB


//Model
const User = mongoose.model("User", userSchema);

//Functions of Passport Local Mongoose to serialize and De-serialize cookies and information within them.
passport.use(User.createStrategy());
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());

app.get("/", function(req,res) {
  res.render("index");
});

app.get("/login", function(req,res) {
  res.render("login");
});

app.get("/register", function(req,res) {
  res.render("register");
});

app.get("/map", function(req, res) {
  if(req.isAuthenticated()) {
    res.render("map");
  } else {
    res.redirect("/login");
  }

});





app.post("/register", function(req, res) {

//We will be using Passport-local-mongoose for all registration and authentication as a middleman for us
User.register({username: req.body.username}, req.body.password, function(err, user) {
  if (err) {
    console.log(err);
    res.redirect("/register")
  } else {
    //If registered successfully, perform LOCAL Authentication - Nothing to UNDERSTAND here
    passport.authenticate("local")(req, res, function(){
        res.redirect("/login");
    });
  }
})

});

app.post("/login", function(req,res) {
const user = new User({
  username: req.body.username,
  password: req.body.password
});

//Login method from Passport
req.login(user, function(err) {
  if (err) {
    console.log(err);
    res.redirect("login");
  } else {
    passport.authenticate("local",) (req, res, function(){
        res.redirect("/map");
      });
  }
})
});

app.get('/logout',
  function(req, res){
    req.logout();
    res.redirect('/');
  });



app.listen(3000, function(){
  console.log("Server started on Port 3000");
});

1 Ответ

0 голосов
/ 20 марта 2020

Я не знаком с использованием сессий или passport-local-mon goose, так как я делал это только с JWT, но я сделал что-то похожее в своем приложении, например:

app. js

var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
var AnonymousStrategy = require('passport-anonymous').Strategy;

passport.use(new LocalStrategy(User.authenticate()));
passport.use(new AnonymousStrategy());

app.use(passport.authenticate(['local', 'anonymous'], { /* any options you want */ })

Вышеуказанное гарантирует, что ваше приложение сможет идентифицировать пользователя как фактического пользователя или как анонимного пользователя.

Затем для защиты конечных точек, требующих входа в систему пользователей, я написал промежуточное ПО например,

function validateUser(req, res, next) {
  if (req.isAuthenticated()) {
    next();
  } else {
    // Error stuff
    res.redirect('/login')
  }

Затем для защиты конечной точки:

app.get("/map", validateUser, function(req, res) {
  res.render("map");
});

или

app.get("/user", validateUser, function(req, res) {
  res.render("profile", { user: req.user });
});
...