2017-12-07 15 views
1

포트 3000에서 실행되는 Express 응용 프로그램이 있습니다. 프런트 엔드는 포트 80에서 실행되므로 CORS 응용 프로그램입니다. 사용자는 SQL 서버 데이터베이스에 저장됩니다. 나는 로컬 전략뿐만 아니라 표현 세션 미들웨어와 인증 방법으로 여권을 사용하고 있습니다. 응용 프로그램은 단일 페이지 응용 프로그램이며 서버에 전송 된 모든 요청은 ajax를 통해 수행됩니다. 사용자가 페이지에 로그인하면 자격 증명이 전송되고 인증에 성공하면 username과 FullNmae는 세션에 유지되어야합니다.Express Passport.js가 세션에서 사용자 개체를 유지하지 않습니다.

나는 이것에 많은 문제가있다 : 중요한 것은 로그인 한 후에 익스프레스가 새로운 세션에 패스포트를 사용하여 사용자 이름과 다른 데이터를 저장하고 페이지의 body 태그를 대체하기 위해 HTML 스 니펫을 다시 보낸다는 것이다. . 그러나 사용자 개체가 지속되는지 테스트하려면/create-user 경로를 호출하고 사용자 개체가 없다고 말합니다. 또한 새 세션은 모든 요청으로 시작됩니다 (로그를 확인하고 매번 다른 세션 ID가 표시됨을 확인합니다). 뿐만 아니라 어느 시점에서 브라우저에서 세션 쿠키를 볼 수 있었지만 더 이상 볼 수 없었습니다. 나는 쿠키를 볼 수있는 지점으로 되돌아 가려고했지만 여전히 나타나지 않았습니다!

저는 몇 시간 동안 머리를 파손 시켰고 deserializeUser가 호출되지 않은 이유나 왜 데이터가 지속되지 않는지를 알 수 없습니다. 내가 어디로 잘못 가고 있니?

참고 : ommitted 몇 가지 명백한 코드 (app.listen() 문을 필요로 등)

/* ------ CONFIGURATIONS ------ */ 
const app = express(); 
const mssqlConfig = JSON.parse(fs.readFileSync("mssql-config.json", "utf8")); 
passport.use(new LocalStrategy(
    function loginAuthentication(username, password, done) { 
     let connPool = new mssql.ConnectionPool(mssqlConfig); 
     connPool.connect(error => { 
      if (error) {console.log(error); return done(error);} 
      ps = new mssql.PreparedStatement(connPool); 
      ps.input('username', mssql.NVarChar(20)); 
      ps.input('password', mssql.NVarChar(50)); 
      ps.prepare('SELECT FullName, fldLoginName, fldEmployeeID, fldPassword FROM tblEmployees WHERE fldLoginName = @username AND fldPassword = @password;', error => { 
       if (error) {console.log(error); return done(error);} 
       ps.execute({username, password}, (error, result) => { 
        if (error) {console.log(error); return done(error);} 
        console.log(result); 
        if (result.recordset.length == 0) { 
         return done(null, false, {message: "There is no user with those credentials!"}); 
        } else if (result.recordset[0].fldLoginName != username || result.recordset[0].fldPassword != password) { 
         return done(null, false, {message: "Username or password is incorrect!"}) 
        } else { 
         return done(null, { 
          ID: result.recordset[0].fldEmployeeID, 
          username: result.recordset[0].fldLoginName, 
          fullName: result.recordset[0].FullName 
         }); 
        } 
        ps.unprepare(error => console.log(error)); 
       }); 
      }); 
     }); 
    } 
)); 
passport.serializeUser((user, done) => { 
    done(null, JSON.stringify(user)); 
}) 
passport.deserializeUser((user, done) => { 
    console.log(user); 
    done(null, JSON.parse(user)); 
}); 

/* ----- MIDDLEWARE ------ */ 
app.use(function allowCrossDomain(request, response, next) { // CORS 
    // intercept OPTIONS method 
    response.header('Access-Control-Allow-Credentials', true); 
    response.header('Access-Control-Allow-Origin', request.headers.origin); 
    response.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE'); 
    response.header('Access-Control-Allow-Headers', 'X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept'); 
    response.header('Access-Control-Max-Age', '60'); 
    if ('OPTIONS' == request.method) { 
     response.sendStatus(200); 
    } else { 
     next(); 
    } 
}); 
app.use(bodyParser.json()); 
app.use(session({ 
    secret:"long string of characters", 
    name:'officetools-extensions', 
    saveUninitialized:false, 
    resave:false, 
    cookie:{secure:false, httpOnly:true, maxAge:86400000, domain:"http://officetools-extensions"}, 
    store: new MemoryStore({checkPeriod:86400000}) 
})); 
app.use(passport.initialize()); 
app.use(function checkRestrictedURL(request, response, next){ 
    console.log(request.url); 
    if (!request.url.match(/^\/login$/g)) { 
     console.log("passed"); 
     passport.session()(request, response, next); 
    } else { 
     next(); 
    } 
}); 

/* ------ ROUTES ------ */ 
app.post('/login', bodyParser.urlencoded({extended:false}), (request, response, next) => { 
    passport.authenticate('local', {session:true}, (error, user, info) => { 
     if (error) { error.status = 500; return next(error); } 
     if (info) { let err = new Error(info.message); err.status = 400; return next(err);} 
     if (!user) { return response.status(401).send("User could not be logged in!"); } 
     console.log(request.sessionID); 
     console.log(user); 
     console.log(request.session); 
     request.logIn(user, function loginCallBack(error) { 
      if (error) { error.status = 500; return next(error);} 
      console.log("after login", request.session); 
      console.log(request.isAuthenticated()); 
      return response.sendFile(path.join(__dirname + "/templates/barcodes.html")); 
     }) 
    })(request, response, next); 
}); 
app.get("/current-user", (request, response, next) => { 
    console.log(request.user, request.session); 
    console.log(request.sessionID); 
    console.log(request.isAuthenticated()); 
    if (request.user) { 
     response.header("Content-Type", "application/json"); 
     return response.send(request.user); 
    } 
    else { return response.status(401).send("There is no user currently logged in!"); } 
}); 

답변

0

내가 그것을 알아 냈어. 세션 설정에서 도메인 속성을 제거하기 만하면됩니다. 그게 효과가있었습니다.