Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用Passport登录会话(Node.js/Express)_Javascript_Node.js_Session_Express_Passport.js - Fatal编程技术网

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

Javascript 使用Passport登录会话(Node.js/Express),javascript,node.js,session,express,passport.js,Javascript,Node.js,Session,Express,Passport.js,如何使用Passport(Express)管理会话登录?通过会话登录,我的意思是:经过身份验证的用户不必在每次请求时重新发送凭据 在下面的示例中,myStrategy.authenticate()会一直被调用,即使用户之前已经过身份验证 var express = require( "express" ); var session = require( "express-session" ); var passport = require( "passport" ); var app = exp

如何使用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.session.passport.user
检索
req.user
,但是
passport.authenticate()
即使定义了
req.user
也会触发,这就破坏了整个要点。

解决方案是将登录操作(在登录页面上)与身份验证检查分离(在受保护的页面上):


您必须检查您自己是否对用户进行了身份验证(例如使用
req.isAuthenticated()
)。检查我的回答。这个问题与您的问题非常相似。
.get( "/auth", passport.authenticate( "mystrategy" ), function( req, res ) {
  res.send( "OK" );
})
.get( "/private", function( req, res ) {
  if ( req.isAuthenticated() ) {
    res.send( "Private data" );
  }
})