繁体   English   中英

使用Passport进行会话登录(Node.js / Express)

[英]Session login with Passport (Node.js/Express)

如何使用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.userreq.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" );
  }
})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM