簡體   English   中英

如何檢查用戶是否使用 node.js 和 mongoose 登錄

[英]How to check if user is logged in with node.js and mongoose

所以我想在 /profile 上說 px 我想知道用戶是否使用命令登錄!

因此,當他轉到主頁“/”時,如果他已登錄,它將呈現 profile.ejs 或用於注冊和登錄的 home.ejs。但是我什么時候不使用 app.get('/登錄'... 因為當我已經使用配置文件重定向到另一個頁面時我再次需要它,但他必須在那里登錄到 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' );

Passport已經包含了登錄用戶和檢查用戶是否在任何路由中通過身份驗證所需的一切。

您已正確識別中間件提供的req.isAuthenticated()函數,以查看用戶當前是否已通過身份驗證。

用戶必須使用 Passport 登錄才能使用該功能。 在您的app.post('/login'路線中,確保您使用 Passport 對用戶進行身份驗證,如下所示:

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

Passport 文檔清楚地解釋了如果您當前的配置不起作用,如何將其設置為用戶名和密碼身份驗證。 他們給出的示例已經使用 mongoose 從數據庫中檢索用戶。

然后可以將req.isAuthenticated()與來自任何路由的 if 語句結合使用,以根據用戶是否登錄有條件地執行代碼。

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 存儲庫以獲取完全有效的快速和護照登錄示例。 只需按照自述文件中的說明運行它。

好吧,首先寫下你想如何定義它..

路由登錄 => 找到令牌 => 驗證並登錄並重定向到儀表板。

路由登錄 => 未找到令牌 => 下一個()

創建一個你想要的任何名稱的中間件..(我將其命名為loginBefore)

const User = require("../model/User");
const jwt = require("jsonwebtoken");

exports.loginBefore = async (req, res, next) => {
  const tokenFind = () => {
    try {
      // check if token found in cookies
      if (req.cookies.token) {
        return req.cookies.token;
      }
      // check if token found body
      if (req.body.token) {
        return req.body.token;
      }
      //check if token found in header
      if (req.header("Authorization")) {
        return req.header("Authorization").replace("Bearer ", "");
      }
    } catch (error) {
      console.log(error);
    }
  };
  const token = tokenFind();

  if (token) {
    // decoding the token with scerect key
    const decoded = jwt.verify(token, process.env.JWTSECRETWORD);

    // asign to a var
    const found = await User.findById(decoded.id);

    if (found) {
      return res.status(200).redirect("/dashboard");
    } else {
  return res.status(400).redirect("/login");
}
  }
  next();
};

稍后 go 到你的路由器頁面

const { loginBefore } = require("../middleware/loginBefore");

讓它需要

router.route("/login").post(loginBefore, login);

然后在需要它之后在下面添加它。 (loginBefore 是檢查令牌的中間件)

const userRouter = require("./route/user");

app.use("/", userRouter);

然后在 app.js 中添加

希望這可以幫助...

我正在檢查是否在 cookies、正文或 header 中找到令牌,然后如果找到則驗證令牌並使用 mongoose 從 mongodb 中找到用戶並將用戶重定向到儀表板。

如果未找到令牌或令牌包含修改后的數據,則重定向到登錄頁面。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM