2017-06-16 67 views
0

我有這個單頁面應用程序,當用戶被成功驗證並重定向到儀表板時,會發出7個Ajax的http請求。當用戶登錄passport進行身份驗證並創建會話時,會重定向到儀表板。當儀表板加載它時,會使7 ajax調用服務器以獲取用戶數據。在本地主機上,它工作正常,但是當此應用程序部署在遠程雲服務器,如果我訪問使用Android設備如智能平板或Windows 10的網站它仍然按預期工作,但在成功驗證和重定向到儀表板後,Windows 7和8,那些假設獲取用戶數據的ajax調用不起作用。當我在遠程服務器上安裝req.user時,它說在該端點內未定義。看起來會話未被設置或被破壞。快速會話在localhost,android設備,windows 10和windows 7或8上的工作方式不同

下面是代碼

'use strict'; 
 
require('dotenv').config(); 
 
var express = require('express'); 
 
var path = require("path"); 
 
var multer = require('multer'); 
 
var bodyParser = require('body-parser'); 
 
var router = express.Router(); 
 
var session = require('express-session'); 
 
var passport = require('passport'); 
 
var flash = require('connect-flash'); 
 
var cookieParser = require("cookie-parser"); 
 
var MongoDBStore = require('connect-mongodb-session')(session); 
 
    
 
var configuration = function (app,model) { 
 
\t //config 
 
\t var storeDB = process.env.MONGODB_ADDON_URI || "mongodb://127.0.0.1:27017/mydb"; 
 
    var store = new MongoDBStore(
 
    { 
 
     uri: storeDB, 
 
     collection: 'mySessions' 
 
    }); 
 
app.use('/assets',express.static(__dirname + '/public')); 
 
//middleware 
 
app.use(cookieParser('anything')); 
 
app.use(session({ 
 
    secret: 'anything', 
 
    store: store, 
 
    resave: true, \t 
 
    saveUninitialized: true, 
 
    cookie: { 
 
    httpOnly: true, 
 
\t originalMaxAge: 35999998, 
 
    path: "/", 
 
    } 
 
})); 
 
\t 
 
app.use(passport.initialize()); 
 
app.use(passport.session()); 
 
app.use(flash()); \t \t 
 
app.use(bodyParser.urlencoded({ extended: false })); 
 
app.use(bodyParser.json()); 
 
app.use(multer({dest: './uploads'}).any()); 
 
app.use(function(req, res, next) { 
 
    res.header('Access-Control-Allow-Credentials', true); 
 
    res.header('Access-Control-Allow-Origin', req.headers.host); 
 
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE'); 
 
    res.header('Access-Control-Allow-Headers', 'X-Requested-With, X- 
 
    HTTP-Method-Override, Content-Type, Accept'); 
 
    if ('OPTIONS' == req.method) { 
 
    res.send(200); 
 
    } else { 
 
\t next(); 
 
    } 
 
}); 
 
    
 
passport.serializeUser(function(user, done) {  
 
    done(null, user._id); 
 
}); 
 
passport.deserializeUser(function(id, done) { \t \t \t 
 
    model.user.findById(id, function(err, user) { 
 
\t done(err, user); 
 
    }); 
 
}); 
 
app.set('view engine', 'ejs'); 
 
app.set('views', __dirname + '/views'); \t 
 
app.use('/',router); 
 

 
} 
 

 
module.exports = { 
 
    configuration: configuration, 
 
    router: router, 
 
    passport: passport \t 
 
} 
 

 
//the login strategy 
 
"use strict"; 
 
var LocalStrategy = require("passport-local").Strategy; 
 
var path = require('path'); 
 
var config = require('./config'); 
 
var salt = require('./salt'); 
 
var router = config.router; 
 
var passport = config.passport; 
 
passport.use('user-login', new LocalStrategy({   
 
    usernameField : 'email', 
 
    passwordField : 'password', 
 
    passReqToCallback : true 
 
}, 
 
function (req, email, password, done) {   
 
    // find a user whose email is the same as the forms email 
 
    // we are checking to see if the user trying to login already exists 
 
    model.user.findOne({ email : email }, function(err, user) {    
 
    // if there are any errors, return the error before anything else 
 
    if (err) { 
 
    return done(err); 
 
    } 
 
    // if no user is found, return the message 
 
    if (!user) { 
 
    return done(null, false, req.flash('loginMessage', 'No user found.')); 
 
    // req.flash is the way to set flashdata using connect-flash 
 
    } 
 
    // if the user is found but the password is wrong 
 
    if (!salt.isValidPassword(user,password)) { 
 
    return done(null, false, req.flash('loginMessage', 'Oops! Wrong password.')); // create the loginMessage and save it to session as flashdata 
 
    }    
 
    return done(null, user); 
 
    }); 
 

 
})); 
 

 
router.post('/user/login', passport.authenticate('user-login', { 
 
    successRedirect : '/dashboard', // redirect to the secure profile section 
 
    failureRedirect : '/failed', // redirect back to the signup page if there is an error 
 
    failureFlash : true // allow flash messages 
 
})); 
 

 
router.get('/dashboard',function(req,res){ 
 
    if(req.user){ 
 
    model.user.findOne({user_id: req.user.user_id}, 
 
    {presence:1,set_presence:1}).exec(function(err,data){ 
 
    data.presence = true; 
 
    data.set_presence.general = true; 
 
    data.save(function(err,info){ 
 
     console.log("presence is true"); 
 
    }); 
 
    });   
 
    res.json({ 
 
     isLoggedIn: true, 
 
     typeOfUser: req.user.type, 
 
     firstname: req.user.firstname, 
 
     lastname:req.user.lastname, 
 
     phone: req.user.phone, 
 
     email: req.user.email, 
 
     title: req.user.title, 
 
     user_id: req.user.user_id, 
 
     balance: req.user.ewallet.available_amount, 
 
     profile_pic_url: req.user.profile_pic_url 
 
     }); 
 
    } else { 
 
    res.redirect("/login"); 
 
    } 
 
}); 
 

 
router.get("/dashboard/patient",function(req,res){ 
 
    if(req.user){ 
 
    res.render("patient",{"userInfo": req.user}); 
 
    } else { 
 
    res.redirect('/login'); 
 
    } 
 

 
}); 
 

 
router.get('/failed',function(req,res){   
 
    res.send(false); 
 
}) 
 

 
//route 
 
//user getting the available on the dashboard balance route. 
 
router.get('/dashboard/:userId/get-balance',function(req,res){ 
 
     console.log(req.user) //undefined 
 
     if(req.user){ 
 
     model.user.findOne({user_id: req.params.userId},{ewallet:1},function(err,wallet){ 
 
      if(err) throw err; 
 
      res.send({balance: wallet.ewallet.available_amount}) 
 
     }) 
 
     } else { 
 
     res.send("Unauthorized access!!!") 
 
     } 
 
    }); 
 

 
//Angular code 
 

 
app.controller('loginController',["$scope","$http","$location","$window","$resource","ModalService","templateService","localManager", 
 
    "$rootScope","mySocket",function($scope,$http,$location,$window,$resource,ModalService,templateService,localManager,$rootScope,mySocket) { 
 
    $scope.login = {}; 
 
    $scope.error = ""; 
 
    
 
    $scope.send = function(){   
 
    var login = $resource('/user/login',null,{logPerson:{method:"POST",headers:{withCredentials: true}}}); 
 
    login.logPerson($scope.login,function(data){ 
 
    console.log(data) 
 
    localManager.setValue("resolveUser",data); 
 
    //$rootScope.balance = data.balance;    
 
    if (data.isLoggedIn) { 
 
     //user joins a room in socket.io and intantiayes his own socket 
 
     switch(data.typeOfUser) { 
 
      case "Patient": 
 
      createAwareness(data) 
 
      $window.location.href = '/dashboard/patient'; 
 
      break; 
 
      case "Doctor": 
 
      createAwareness(data) 
 
      $window.location.href = "/dashboard/doctor"; 
 
      break; 
 
      case "Pharmacy": 
 
      $window.location.href = "/medical-center/pharmacy"; 
 
      break;   
 
      default: 
 
      $window.location.href = "/medical-center/view"; 
 
      break; 
 

 
     } 
 
     
 
     } else {  
 
     $scope.error = "Email or Password incorrect!";    
 
     } 
 
    }); 
 
    } 
 

 
    //this updates the current availability of user in real time. 
 
    function createAwareness(data) { 
 
    mySocket.emit("set presence",{status:"online",userId:data.user_id},function(response){ 
 
     if(response.status === true){ 
 
     if(data.typeOfUser === "Doctor"){ 
 
      mySocket.emit("doctor connect",{userId:data.user_id}); 
 
     } else if(data.typeOfUser === "Patient") { 
 
      mySocket.emit("patient connect",data); 
 
     } 
 
     } 
 
    });         
 
    
 
    } 
 
    
 
}]); 
 

 
//one of the ajax get requests made from within dashboard as the page loads. 
 
app.controller("balanceController",["$rootScope","$resource","localManager",function($rootScope,$resource,localManager){ 
 
    var user = localManager.getValue("resolveUser");//this was set in the login controller 
 
    var amount = $resource('/dashboard/:userId/get-balance',{userId: user.user_id}); 
 
    var wallet = amount.get(null,function(data){ 
 
    console.log(data) //"unauthorized access !!!" 
 
     var format = "N" + data.balance.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); 
 
     $rootScope.balance = format; 
 
    }) 
 
}]); 
 
    
 

 
<!-- login form --> 
 
<form> 
 
    <input type="text" placeholder="Email" ng-model = "login.email" style="border: 1px solid rgba(0,255,0,0.8)"> 
 
    <input type="password" placeholder="Password" ng-model = "login.password" style="border: 1px solid rgba(0,255,0,0.8);margin: 10px 0px"> 
 
    <div style="text-align: center"> 
 
\t <button class="btn btn-login" ng-click="send()" style="color: #fff;">LOGIN</button> 
 
    </div> 
 
    </form>
請我需要你的幫助。

回答

0

我發現我做錯了。我沒有在傳遞給會話的選項的cookie屬性中指定路徑指向「/user/login".note默認路徑爲」/「的認證路由。我將路徑設置爲「/ user」,然後修改了通過ajax調用進行的請求路由,如'/ user /:userId/get-balance'。這實際上並沒有創建一個新的會話或未設置現有的會話,它的工作!

相關問題