2017-12-07 1 views
1

Ich habe eine Express-Anwendung läuft auf Port 3000. Das Front-End läuft auf Port 80, so ist dies eine CORS-Anwendung. Benutzer werden in einer SQL Server-Datenbank gespeichert. Ich benutze Passport als Authentifizierungsmethode mit Local Strategy sowie Express Session Middleware. Die Anwendung ist eine einseitige Anwendung und alle Anfragen, die an den Server gesendet werden, werden über Ajax erledigt. Benutzer melden sich auf der Seite an und die Anmeldeinformationen werden gesendet. Wenn die Authentifizierung erfolgreich ist, sollten BenutzerID sowie Benutzername und FullNmae in einer Sitzung beibehalten werden.Express Passport.js nicht persistent Benutzerobjekt in Sitzung

Ich habe eine Menge Dinge falsch mit: Die Hauptsache ist, dass Express nach dem Einloggen speichert den Benutzernamen und andere Daten mit Pass zu einer neuen Sitzung und sendet zurück ein HTML-Snippet, um das Body-Tag auf der Seite zu ersetzen . Um zu testen, ob das Benutzerobjekt persistent ist, rufe ich die Route/create-user auf und sagt, dass das Benutzerobjekt nicht vorhanden ist. Darüber hinaus startet eine neue Sitzung mit jeder Anfrage (Ich überprüfe die Protokolle und sehe, dass jedes Mal eine andere Sitzungs-ID angezeigt wird). Nicht nur das, aber irgendwann konnte ich den Sitzungscookie im Browser sehen, aber ich kann ihn nicht mehr sehen. Ich versuchte, zu dem Punkt zurückzukehren, an dem ich den Keks sehen konnte, aber er erschien immer noch nicht!

Ich habe mir stundenlang den Kopf zerbrochen und kann nicht herausfinden, warum deserializeUser nicht aufgerufen wird und warum die Daten nicht bestehen. Wo gehe ich falsch?

Hinweis: einige offensichtliche Code weggelassen (app.listen(), erfordern Aussagen usw.)

/* ------ 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!"); } 
}); 

Antwort

0

ich es herausgefunden. Ich musste nur die Domain-Eigenschaft in den Sitzungseinstellungen entfernen. Das hat es funktioniert.

Verwandte Themen