Как проверить, если пользователь вошел в систему с node.js и мангуст - PullRequest
0 голосов
/ 31 января 2020

Итак, я хочу, скажем, px на / profile. Я хочу знать, если пользователь вошел в систему с помощью команды!

Так что, когда он перейдет на домашнюю страницу "/", он будет отображать любой профиль. e js, если он вошел в систему или home.e js, чтобы зарегистрироваться и войти. Но я этого не делаю, когда делаю это с app.get ('/ login' ... потому что мне это нужно снова, когда я Я уже использую профиль для перенаправления на другую страницу, но он должен войти туда go.

Вот код:

if (process.env.NODE_ENV !== 'production') {
  require('dotenv').config()
}

const express = require('express')
const app = express()
const bcrypt = require('bcrypt')
const passport = require('passport')
const flash = require('express-flash')
const session = require('express-session')
const methodOverride = require('method-override')
const initializePassport = require('./passport-config')
var mongodb = require('mongodb');
const bodyParser = require('body-parser');
initializePassport(
  passport,
  email => users.find(user => user.email === email),
  id => users.find(user => user.id === id)
)

var urlencodedParser = bodyParser.urlencoded({extended:false})
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";
const users = []

var http = require('http');

/* ************ */
app.use(express.static(__dirname + '/public'));
app.set('view-engine', 'ejs')
app.use(express.urlencoded({ extended: false }))
app.use(flash())
app.use(session({
  secret: process.env.SESSION_SECRET,
  resave: false,
  saveUninitialized: false
}))
app.use(passport.initialize())
app.use(passport.session())
app.use(methodOverride('_method'))


app.use( bodyParser.json() );     

var dbConn = mongodb.MongoClient.connect('mongodb://localhost:27017/');

var path = require('path');

const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/nyg', {useNewUrlParser: true});
const Schema = mongoose.Schema;

const userSchema = new Schema({
  email: String,
  password: String
});

const User = mongoose.model('users', userSchema);

app.post('/register', async (req, res, next) => {
  const user = await User.findOne({
    email: req.body.email,
    password: req.body.password
  }).exec();

  if (user) {
    res.redirect('/register');
    next();
  }

  else new User({
    email: req.body.email,
    password: req.body.password
  })
    .save()
    .exec();
  res.redirect('/login');
  next();
});

app.post('/login', async (req, res, next) => {
  const user = await User.findOne({
    email: req.body.email,
    password: req.body.password
  });
  if (user) res.redirect('/');
  else res.redirect('/login');
  next();
});


app.get('/', (req, res) => {
  if (req.isAuthenticated()) res.render('profile.ejs')

  else res.render('index.ejs')
})

app.get('/login', (req, res) => {
  res.render('login.ejs')
})


app.get('/register', (req, res) => {
  res.render('register.ejs')
})


app.delete('/logout', (req, res) => {
  req.logOut()
  res.redirect('/login')
})



app.listen(process.env.PORT || 3000, process.env.IP || '0.0.0.0' );

1 Ответ

0 голосов
/ 31 января 2020

Паспорт уже содержит все необходимое для входа пользователя в систему и проверки подлинности пользователя на каком-либо маршруте.

Вы правильно определили, что функция req.isAuthenticated() предоставляется промежуточное ПО для проверки подлинности пользователя в данный момент.

Для работы функции пользователь должен войти в систему с помощью Passport. В вашем маршруте app.post('/login' убедитесь, что вы аутентифицируете пользователя по паспорту следующим образом:

passport.authenticate('local', { successRedirect: '/', failureRedirect: '/login' }));

В документации по паспорту четко объясняется, как настроить его для аутентификации по имени пользователя и паролю. если ваша текущая конфигурация не работает. Примеры, которые они приводят, уже используют mon goose для извлечения пользователей из базы данных.

req.isAuthenticated() может затем использоваться в сочетании с оператором if любого маршрута для условного выполнения кода в зависимости от того, зарегистрирован ли пользователь in.

if (req.isAuthenticated()) {
  // The user is logged in
} else {
  // The user is logged out
}

В качестве альтернативы, вы можете создать простое промежуточное ПО, которое будет разрешать доступ к маршруту, только если пользователь вошел в систему.

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

Используйте его следующим образом:

app.get('/protectedRoute', loggedIn, (req, res) => {
  // The user is logged in otherwise they would have been redirected
})

См. мой репозиторий GitHub для примера полностью работающего express и паспорта. Просто следуйте инструкциям в readme, чтобы запустить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...