2017-12-07 7 views
1

私はExpressアプリケーションをポート3000で実行しています。フロントエンドはポート80上で実行されるため、CORSアプリケーションです。ユーザーはSQLサーバーデータベースに格納されます。私はLocal StrategyとExpressセッションミドルウェアの認証方法としてパスポートを使用しています。アプリケーションはシングルページアプリケーションであり、サーバーに送信されるすべてのリクエストはajax経由で行われます。ユーザーがページにログインし、資格情報が送信され、認証が成功すると、usernameとFullNmaeはセッションに永続化されます。Express Passport.jsがセッション中のユーザーオブジェクトを維持していません

私はこれに多くのことが間違っています:主なものは、ログイン後、エクスプレスは新しいセッションにパスポートを使用してユーザー名と他のデータを保存し、ページ上のbodyタグを置き換えるためにHTMLスニペットを送ります。しかし、ユーザーオブジェクトが存続することをテストするために、私は/ create-userルートを呼び出し、ユーザーオブジェクトがそこにないことを示します。さらに、新しいセッションはすべてのリクエストから開始します(ログをチェックし、毎回異なるセッションIDが表示されることを確認します)。それだけでなく、ある時点で私はブラウザでセッションクッキーを見ることができましたが、もはやそれを見ることはできません。私はクッキーを見ることができるところに戻ろうとしましたが、まだ現れませんでした!

私は何時間も頭を悩ましていて、なぜdeserializeUserが呼び出されないのか、なぜデータが保持されないのか分かりません。どこが間違っていますか?

注:省略さいくつかの明白なコード(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

が、私はそれを考え出しました。セッション設定でドメインプロパティを削除するだけでした。それが機能しました。

関連する問題