如何使用Passport(Express)管理会话登录?通过会话登录我的意思是:经过身份验证的用户不必在每个请求时重新发送凭据。
在以下示例中,即使用户先前已经过身份验证,myStrategy.authenticate()
也会一直被调用。
var express = require( "express" );
var session = require( "express-session" );
var passport = require( "passport" );
var app = express();
var myStrategy = function(){ this.name = "mystrategy"; };
myStrategy.prototype.authenticate = function( req ) {
console.log( "called" );
this.success( "user" );
};
passport.use( new myStrategy() );
passport.serializeUser( function( id, cb ){ cb( null, id ); });
passport.deserializeUser( function( id, cb ){ cb( null, id ); });
app
.use( session({ secret: "hello", resave: true, saveUninitialized: true }) )
.use( passport.initialize() )
.use( passport.session() )
.get( "/", passport.authenticate( "mystrategy" ), function( req, res ) {
res.send( "OK" );
})
.listen( 80 );
似乎passport.session()
从req.user
检索req.session.passport.user
,但passport.authenticate()
即使在定义req.user
时也会发射,这会击败整个点。
解决方案是将登录操作(在登录页面上)与身份验证检查(在受保护的页面上)分离:
.get( "/auth", passport.authenticate( "mystrategy" ), function( req, res ) {
res.send( "OK" );
})
.get( "/private", function( req, res ) {
if ( req.isAuthenticated() ) {
res.send( "Private data" );
}
})