2016-09-09 6 views
0

express를 사용하여 로그인 인증을위한 코드를 작성했습니다. 나는 express-session을 사용했다. 로그인에 성공 req.session.admintrue로 설정 한 후 코드 샘플은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); 
    }); 
}); 

입니다. 그러나 인증 미들웨어 (auth)에서는 401 상태를 보냅니다. 이 문제를 해결하도록 도와주세요.

코드 : 는

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; 
+0

'auth' 함수의'req.session.admin' 값은 무엇입니까? – abdulbarik

+0

로그인 엔드 포인트에서 'true'로 설정됩니다. 그러나 auth 기능에서 '정의되지 않은'기능을 제공합니다. – SaiUnique

+0

어떤 익스프레스 버전을 사용하고 있습니까? – abdulbarik

답변

0

var app = express(); 

app.use(express.cookieParser()); 
app.use(express.session({secret: "sdsddsd23232323" })); 
처럼 express 객체 후 상단에있는 서버 파일에서 이러한 라인을 사용 //app.js
+0

나에게 잘 돌아가고 있는데, 질문에 서버 코드를 게시 할 수 있습니까? – abdulbarik

관련 문제