簡體   English   中英

使用快速會話時身份驗證失敗

[英]Authentication failure when using express-session

我使用express編寫了一些用於登錄身份驗證的代碼。 我使用了express-session 代碼示例為

// Authentication and Authorization Middleware
var auth = function(req, res, next) {
    if (req.session && req.session.admin) {
        return next();
    } else {
        console.log("failed");
        return res.sendStatus(401);
    }
}

// Login endpoint
router.post('/login', function (req, res) {
    var collection = db.get("login");
    collection.find({}, function(err, details) {
        if (!req.body.username || !req.body.password) {
            res.send('login failed');   
        } else if(req.body.username === details[0].name && req.body.password === details[0].password ) {
            req.session.admin = true;
            var data = {
                "status": "success",
                "message": "login success!"
            }
            res.send(data);
        } else {
            var data = {
                "status": "failure",
                "message": "login failed"
            }
            res.send(data);
        }
    });

});

// Logout endpoint
router.get('/logout', auth, function (req, res) {
    req.session.destroy();
    res.send("logout success!");
});

//Getting  Details endpoint
router.get("/data", auth, function(req, res) {
    var collection = db.get('details');
    collection.find({}, function(err, details){
        if (err) throw err;
        res.json(details);
    });
});

成功登錄后, req.session.admin設置為true 但是,在身份驗證中間件(auth)處,它正在發送401狀態。 請幫我解決這個問題。

代碼://app.js

var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var session = require('express-session');


var getDetails = require('./routes/getDetails');

var app = express();

app.use(function (req, res, next) {

    // Website you wish to allow to connect
    res.setHeader('Access-Control-Allow-Origin', '*');

    // Request methods you wish to allow
    res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');

    // Request headers you wish to allow
    res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');

    // Set to true if you need the website to include cookies in the requests sent
    // to the API (e.g. in case you use sessions)
    res.setHeader('Access-Control-Allow-Credentials', true);

    // Pass to next layer of middleware
    next();
});

// view engine setup

// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(express.cookieParser());
app.use(express.static(path.join(__dirname, 'routes')));
app.use(express.session({
    secret: '2C44-4D44-WppQ38S',
    resave: true,
    saveUninitialized: true
}));


app.use('/getDetails',getDetails);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  var err = new Error('Not Found');
  err.status = 404;
  next(err);
});

// error handlers

// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
  app.use(function(err, req, res, next) {
    res.status(err.status || 500);
    res.render('error', {
      message: err.message,
      error: err
    });
  });
}

// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
  res.status(err.status || 500);
  res.render('error', {
    message: err.message,
    error: {}
  });
});

//app.listen(3001);
module.exports = app;

//getDetails.js

var express = require('express');
var router = express.Router();
var monk = require('monk');
var db = monk('localhost:27017/saidb');




// Login endpoint
router.post('/login', function (req, res) {
    var collection = db.get("login");
    //var data;
    collection.find({}, function(err, details) {
        //res.json(details);
        if (!req.body.username || !req.body.password) {
            res.send('login failed');   
        } else if(req.body.username === details[0].name && req.body.password === details[0].password ) {
            req.session.admin = true;
            var data = {
                "status": "success",
                "message": "login success!"
            }
            res.send(data);
        } else {
            var data = {
                "status": "failure",
                "message": "login failed"
            }
            res.send(data);
        }
    }); 
});   
var auth = function(req, res, next) {
    if (req.session && req.session.admin) {
        console.log("success");
        return next();
    } else {
        console.log("failed");
        return res.sendStatus(401);
    }
}

// Logout endpoint
router.get('/logout', auth, function (req, res) {
    req.session.destroy();
    res.send("logout success!");
});

//Getting  Details endpoint
router.get("/data", auth, function(req, res) {
    var collection = db.get('details');
    collection.find({}, function(err, details){
        if (err) throw err;
        res.json(details);
    });
});


//Get details by ID endpoint
router.get("/data:id", auth, function(req, res) {
    var collection = db.get('details');
    collection.find({id: parseInt(req.params.id)}, function(err, details){
        if (err) throw err;
        res.json(details);
    });
});


//Adding Details endpoint
router.post("/data", auth, function(req, res) {
    var collection = db.get("details");
    collection.count({id : parseInt(req.body.id)},function(err,count){
        if(!err){
            if(count>0){
                //send the response that its duplicate.

                //console.log(errorororrrroror);
                res.send("r");
            }
        }
    });
    console.log("request", req.body);
    collection.insert({ id: parseInt(req.body.id), 
                        website: req.body.website, 
                        subtitle: req.body.subtitle, 
                        url: req.body.url }, 
                        function(err, details) {
                            if(err) throw err;
                            res.json(details);
                        })
});


//Editing Details endpoint
router.put("/data", auth, function(req,res){
    var collection = db.get("details");
    collection.update({id: parseInt(req.body.id)},
                      {id: parseInt(req.body.id), website: req.body.website, subtitle: req.body.subtitle, url: req.body.url},
                      function(err, details){
                          if(err) throw err;
                          res.json(details);
                      })
});


//Deleting details endpoint
router.delete("/data", auth, function(req,res){
    var collection = db.get("details");
    collection.remove({id: parseInt(req.body.id)}, function(err, details){
        if(err) throw err;
        res.json(details);
    })
});


module.exports = router;

在這樣的express對象之后,在服務器文件的頂部使用這些行

var app = express();

app.use(express.cookieParser());
app.use(express.session({secret: "sdsddsd23232323" }));

暫無
暫無

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

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