Passport不能在会话变量中保存。要求的事情。用户导航后不存在。

时间:2020-12-24 23:59:40

Background:

I have a angular-cli running on port 4200, and server sided api node.js running on 3000.

我在端口4200和服务器端api节点上运行一个angular-cli。js在3000上运行。

I find out that the session passport value wont save after logging in with the passport-local.

我发现在登录到passport-local后,session passport值无法保存。

so when i try to navigate to another page after logging in, its not holding the passport, variable in sessions as it is supposed to, required to call req.user

因此,当我尝试在登录后导航到另一个页面时,它并没有保存passport,这是会话中的变量,需要调用req.user

For some reason, the server is not calling deserialize user.

由于某些原因,服务器没有调用反序列化用户。

Req.user wont work after login and redirecting to page /test.

要求的事情。用户在登录和重定向到页面/测试之后不会工作。

Update:

更新:

To login i send a request from site using port 4200, with the following code: (angular2/4)

要登录,我使用端口4200从站点发送请求,代码如下:(angular2/4)

performLogin(name: string, password: string): Observable<Comment[]> {
    var params = new URLSearchParams();
    params.append('username', name);
    params.append('password', password);
  url = "SITE:3000/api/login";

    return this.http.post(this.url,params, this.options)
        .map(result => result.json())
        .do(result => this.result = result);
  }

Update 2: inserted creditals request client sided. On every request to login -> then calling test page i always get:

更新2:插入creditals请求客户端。对于每一个登录请求->然后调用测试页面,我总是得到:

ReferenceError: User is not defined
    at /root/mafiagame/src/config/passport.js:32:9
    at pass (/usr/lib/node_modules/passport/lib/authenticator.js:347:9)
    at Authenticator.deserializeUser (/usr/lib/node_modules/passport/lib/authenticator.js:352:5)
    at SessionStrategy.authenticate (/usr/lib/node_modules/passport/lib/strategies/session.js:53:28)
    at attempt (/usr/lib/node_modules/passport/lib/middleware/authenticate.js:348:16)
    at authenticate (/usr/lib/node_modules/passport/lib/middleware/authenticate.js:349:7)
    at Layer.handle [as handle_request] (/root/mafiagame/node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (/root/mafiagame/node_modules/express/lib/router/index.js:317:13)
    at /root/mafiagame/node_modules/express/lib/router/index.js:284:7
    at Function.process_params (/root/mafiagame/node_modules/express/lib/router/index.js:335:12)
    at next (/root/mafiagame/node_modules/express/lib/router/index.js:275:10)
    at initialize (/usr/lib/node_modules/passport/lib/middleware/initialize.js:53:5)
    at Layer.handle [as handle_request] (/root/mafiagame/node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (/root/mafiagame/node_modules/express/lib/router/index.js:317:13)
    at /root/mafiagame/node_modules/express/lib/router/index.js:284:7
    at Function.process_params (/root/mafiagame/node_modules/express/lib/router/index.js:335:12)

Related issues, that did not fix my problem:

相关的问题,没有解决我的问题:

Passportjs not saving user into session after login

Passportjs在登录后不将用户保存到会话中

PassportJS deserializeUser never called

PassportJS deserializeUser从不叫

Express Passport Session not working

特快护照无效

req.session.passport is empty, deserializeUser not called - ExpressJS, Passport

req.session。护照是空的,deserializeUser不叫- ExpressJS,护照

Main issue: Req.user wont work after login and redirecting to page /test.

主要问题:要求。用户在登录和重定向到页面/测试之后不会工作。

It seems like the session is saved, but the passport details within that session, is not.

看起来会话被保存了,但是那个会话中的护照细节没有保存。

My application:

我的应用程序:

dump of req.session after login:

转储申请。会话登录后:

 Session {
      cookie:
       { path: '/',
         _expires: 2017-05-03T19:42:58.728Z,
         originalMaxAge: 14400000,
         httpOnly: true,
         secure: false },
      passport: { user: '5909a6c0c5a41d13340ecf94' } }

session when visiting /test

当访问/测试会话

Session {
  cookie:
   { path: '/',
     _expires: 2017-05-03T19:43:10.503Z,
     originalMaxAge: 14400000,
     httpOnly: true,
     secure: false } }

server.js

server.js

here is my server.js with the express, passport etc.

这是我的服务器。有快递、护照等。

var express    = require('express');        // call express
var app        = express();                 // define our app using express
var bodyParser = require('body-parser');
var mongoose = require('mongoose');
var session      = require('express-session');
var router = express.Router();
var Account = require('src/app/models/Users.js');
var Core = require('src/app/gamemodels/core');
// Init passport authentication
var passport = require('passport');
var Strategy = require('passport-local').Strategy;
require('src/config/passport')(passport);
var cookieParser = require('cookie-parser')


app.use(function(req, res, next) {
    res.header('Access-Control-Allow-Credentials', true);
    res.header('Access-Control-Allow-Origin', req.headers.origin);
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
    res.header('Access-Control-Allow-Headers', 'X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept');
    if ('OPTIONS' == req.method) {
        res.send(200);
    } else {
        next();
    }
});


// required for passport session

app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
mongoose.connect('database');
app.use(cookieParser()) // required before session.

app.use(session({
    secret: 'xxx',
    cookie: {
        secure: false
    }}));

app.use(passport.initialize());
app.use(passport.session());



console.log(mongoose.connection.readyState);
app.use(function (req, res, next) {
    console.log('Time:', Date.now());

   // core.loggameRequest();
    next();
});


var port = process.env.PORT || 3000;        // set our port


// test route to make sure everything is working (accessed at GET http://localhost:8080/api)
router.get('/', function(req, res) {
    res.json({ text: 'hooray! welcome to our api!' });
});


router.get('/test', function(req,res) {
    console.log(req.user);
    res.json(req.user);
});

router.get("/getuser", function(req,res) {
    Account.findOne({}, function (err,response) {
        console.log("starting core...");
        console.log(Core);
        console.log("core log end");
    //    Core.experienceToRankDetails(response.xp,'female');
        console.log("executed!");
     //   res.json(response);
        Core.experienceToRankDetails(response.xp,'female').then(function (result) {

            res.json({user: response, rank: result});

        });

    });
});

router.get('/onlinestate', function(req,res) {
    if (req.user) {
        res.json(true);

    } else {
        res.json(false);
    }
});


router.post('/signup', passport.authenticate('local-signup', {
    successRedirect : '/profile', // redirect to the secure profile section
    failureRedirect : '/signup', // redirect back to the signup page if there is an error
}));

router.post('/login', passport.authenticate('local-login'), function(req, res) {

    console.log("executed login!");
    console.log(req.user);
    req.session.user = req.user;
    req.logIn(req.user, function (err) { // have this in passport login too, but tried it here too .
        if (err) {
            return next(err);
        }

    });

});

/*
router.post('/login', function(req,res) {
    console.log("routing post login");
    console.log(req.body);
    console.log(req.user);

    var username = req.body.username;
    var password = 0;
    console.log("using passport");
    passport.authenticate('local', {failureRedirect: '/login'}, function (req, res) {
        console.log("performed!");
        res.redirect('/');
    });






});
*/



// more routes for our API will happen here

// REGISTER OUR ROUTES -------------------------------
// all of our routes will be prefixed with /api
app.use('/api', router);



*/
// START THE SERVER
// =============================================================================
app.listen(port);
console.log('Magic happens on port ' + port);

passport:

护照:

// config/passport.js

// load all the things we need
var LocalStrategy   = require('passport-local').Strategy;

// load up the user model
var Account = require('src/app/models/Users.js');

// expose this function to our app using module.exports
module.exports = function(passport) {

    passport.serializeUser(
        function(user, done){
            console.log("serialize");
            done(null, user.id);
        });

    passport.deserializeUser(
        function(id, done){
            console.log("deserialize " + id);
            Account.findById(id, function(err, user){
                if(err){
                    done(err);
                }
                done(null, user);
            });
        });
    passport.use('local-login', new LocalStrategy({
            // by default, local strategy uses username and password, we will override with email
            usernameField : 'username',
            passwordField : 'password',
            passReqToCallback : true // allows us to pass back the entire request to the callback
        },
        function(req, username, password, done) { // callback with email and password from our form
            console.log("doing local login");
            // find a user whose email is the same as the forms email
            // we are checking to see if the user trying to login already exists
            Account.findOne({ 'username' :  username }, function(err, user) {
                var thisuser = user;
                console.log("query account is done");
                // if there are any errors, return the error before anything else
                if (err) {
                    console.log("error occured");
                    return done(err);
                }

                console.log("if user exist check");


                // if no user is found, return the message
                if (!user)
                    return done(null, false,'No user found.'); // req.flash is the way to set flashdata using connect-flash


                console.log("checking password");
                // if the user is found but the password is wrong
                if (!user.validPassword(password)) {
                    console.log("password is not valid");
                    return done(null, false, 'Oops! Wrong password.'); // create the loginMessage and save it to session as flashdata

                }
                console.log("all good! logging in!");


                req.login(thisuser, function(error) {
                    if (error) return next(error);
                    console.log(error);

                    console.log("Request Login supossedly successful.");
                });

                // all is well, return successful user
                return done(null, thisuser);
            });

        }));

    passport.use('local-signup', new LocalStrategy({
            // by default, local strategy uses username and password, we will override with email
            usernameField : 'email',
            passwordField : 'password',
            passReqToCallback : true // allows us to pass back the entire request to the callback
        },
        function(req, username, password, done) {
            process.nextTick(function() {
                    console.log("doing local signup");
                // find a user whose email is the same as the forms email
                // we are checking to see if the user trying to login already exists
                Account.findOne({ 'username' :  username }, function(err, user) {
                    // if there are any errors, return the error
                    if (err)
                        return done(err);

                    // check to see if theres already a user with that email
                    if (user) {
                        return done(null, false, 'That username is already taken.');
                    } else {

                        var newUser            = new Account();

                        // set the user's local credentials
                        newUser.username    = username;
                        newUser.password = newUser.encryptPassword(password);

                        // save the user
                        newUser.save(function(err) {
                            if (err)
                                throw err;
                            return done(null, newUser);
                        });
                    }

                });

            });

        }));

};

user variable contains:

用户变量包含:

{ _id: 5909a6c0c5a41d13340ecf94,
  password: '$2a$10$tuca/t4HJex8Ucx878ReOesICV6oJoS3AgYc.LxQqCwKSV8I3PenC',
  username: 'admin',
  __v: 0,
  inFamily: false,
  bank: 500000,
  cash: 1,
  xp: 0,
  rank: 1,
  bullets: 0,
  location: 1,
  permission: 0,
  health: 100 }

response from server after logging in: (post to /login route)

登录后服务器的响应:(post到/登录路径)

doing local login
query account is done
if user exist check
checking password
all good! logging in!
serialize
undefined
Request Login supossedly successful.
serialize
executed login!
{ _id: 5909a6c0c5a41d13340ecf94,
  password: '$2a$10$tuca/t4HJex8Ucx878ReOesICV6oJoS3AgYc.LxQqCwKSV8I3PenC',
  username: 'admin',
  __v: 0,
  inFamily: false,
  bank: 500000,
  cash: 1,
  xp: 0,
   rank: 1,
  bullets: 0,
  location: 1,
   permission: 0,
  health: 100 }
serialize

server response from visiting /test

来自访问/测试的服务器响应

undefined

1 个解决方案

#1


2  

It seems to be an angular 2/4 issue. you can try this this or this

看起来是角2/4的问题。你可以试试这个或这个

Hope it can help you! :-)

希望它能对你有所帮助!:-)

#1


2  

It seems to be an angular 2/4 issue. you can try this this or this

看起来是角2/4的问题。你可以试试这个或这个

Hope it can help you! :-)

希望它能对你有所帮助!:-)