【问题标题】:passport local mongoose cookie not created未创建护照本地猫鼬cookie
【发布时间】:2021-10-24 07:26:05
【问题描述】:

我是网络开发的新手。我编写了一个 MERN 应用程序,React 应用程序在 localhost:3000 上运行,后端在 localhost:5000 上运行。我正在使用护照本地猫鼬进行身份验证。 Auth 运行良好,但浏览器中没有创建 cookie。

任何帮助表示赞赏。这是我的验证码:

passport.authenticate('local', function (err, user, info)
    {
        if (err) {
            console.log("Auth error: " + err); // FIXME
            res.json({success: false, message: err})
            return;
        }
        if (! user) {
            console.log("Username or password incorrect"); // FIXME
            res.json({success: false, message: 'Username or password incorrect'})
            return;
        }

        req.login(user, function(err)
        {
            if (err) {
                console.log("login error: " + err); // FIXME
                res.json({success: false, message: err})
                return;
            }

            // perform a deep copy of user
            const newUser = JSON.parse(JSON.stringify(user));

            // get user without salt and hash
            const {salt, hash, ...userNoSaltHash} = newUser

            res.json({success: true, message: "Authentication successful", user: userNoSaltHash});
        });
    })(req, res);

这是我的 server.js

require('dotenv').config({path: './config/config.env'});
const express = require('express');
const connectDB = require('./config/db.js')
const errorHandler = require('./middleware/error.js');
const session = require('express-session');
const passport = require('passport');
const cors = require('cors');

const port = process.env.PORT || 5000;

// connect to mongoDB database
connectDB();

const app = express();

// setup CORS: https://www.youtube.com/watch?v=PNtFSVU-YTI
app.use(cors({
    origin: 'http://127.0.0.1:3000',
    // FIXME methods: ['GET', 'POST'],
    credentials: true,
}));

// FIXME do we need this?
app.use(express.static('public'));

// user body-parser get data JSON from body
app.use(express.json());

// FIXME read the docs and ensure these are what we want
app.use(session({
    //secret: process.env.SESSION_SECRET, // FIXME
    secret: 'this is one jsaldfjklsfjklsdf f fjklsfj sjflsdfjdsjfdsf.',
    resave: false,
    saveUninitialized: false,
    //cookie: {secure: true}
}));

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

app.use('/', require('./routes/auth'));

const User = require('./models/User.js')

passport.use(User.createStrategy());

// use static serialize and deserialize of model for passport session support
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());

// setup custom error handler; THIS SHOULD BE LAST PIECE OF MIDDLEWARE
app.use(errorHandler);

// middleware to print debug info
// app.get('/login', (req, res) =>
// {
//     console.log("Get: login");
//     res.send('Hello!')
// });

const server = app.listen(port, () => {console.log(`App listening on port ${port}`)});

process.on('unhandledRejection', (err, promise) =>
{
    console.log(`### Error: ${err}`);
    server.close(() => process.exit(1));
});

【问题讨论】:

    标签: passport.js passport-local passport-local-mongoose


    【解决方案1】:

    我认为您面临的问题是创建会话并在服务器重新启动时存储它。我不确定我的示例是否会提供任何指导,但它对我有用。即使服务器重新启动,我也使用 mongo store 来存储 cookie。 我也是新手,但希望对您有所帮助

    这是我的护照本地启动验证码

    const passport = require('passport');
    
    const LocalStrategy = require('passport-local').Strategy;
    
    const User = require('../models/user');
    
    // authetication using passport
    passport.use(new LocalStrategy({
        usernameField: 'email'
    
    },
        function(email,password, done){
            // find a user and establish the identity
            User.findOne({email: email}, function(err, user){
                if (err){
                    console.log('error in finding user --> passport');
                    return done(err);
                }
                if (!user || user.password != password){
                    console.log('Invalid username/password');
                    return done(null, false);
                }
                return done(null, user);
            });
        }
    )); 
    
    // serializing the user to decide which key is to kept in the cookies
    passport.serializeUser(function(user, done){
        done(null, user.id);
    });
    
    
    // deserializing the user from the key in the cookies
    passport.deserializeUser(function(id, done){
        User.findById(id, function(err, user){
            if (err){
                console.log('error in finding user --> passport');
                return done(err);
            }
            return done(null, user);
        });
    });
    
    // check if the user is authenticated
    passport.checkAuthentication = function(req,res,next){
        // if the user is signed in, then pass on the request to next function which is controller function
        if(req.isAuthenticated()){
            return next();
        }
        //  if the user is not signed in
        return res.redirect('/users/sign-in');
    }
    
    passport.setAuthenticatedUser = function(req,res,next){
        if (req.isAuthenticated()){
            // req.user contains the current signned in user from the session cookies and we are just sending this to the locals for the views
            res.locals.user = req.user
        }
    
        next();
    }
    
    
    
    
    module.exports = passport;
    

    这是我的 server.js

    const express = require('express');
    const cookieParser = require('cookie-parser');
    const app = express();
    const port= 8000;
    const expressLayouts = require('express-ejs-layouts');
    const db = require('./config/mongoose');
    // used for session cookies
    const session = require('express-session');
    const passport = require('passport');
    const passportLocal = require('./config/passport-local-strategy');
    const MongoStore = require('connect-mongo');
    const sassMiddleware = require('node-sass-middleware');
    
    
    // setting up sassMiddleware
    app.use(sassMiddleware({
        src: './assets/scss',
        dest: './assets/css',
        debug: true,
        outputStyle: 'expanded',
        prefix: '/css'
    }));
    
    
    app.use(express.urlencoded());
    app.use(cookieParser());
    
    
    //use assets folder for styling page
    app.use(express.static('./assets'));
    
    // using express layouts
    app.use(expressLayouts);
    //extract style and scripts from subpages into layouts
    app.set('layout extractStyles', true);
    app.set('layout extractScripts', true);
    
    // set view engine
    app.set('view engine', 'ejs');
    app.set('views', './views');
    
    
    // express-session setup mongo store is used to store the session coolkie in the db
    app.use(session({
        name:  'codeial',
        // TODO to change the secret before deployment
        secret : 'blahsomething',
        saveUninitialized: false,
        resave: false,
        cookie: {
            maxAge: (1000 * 60 * 100)
        },
        store: MongoStore.create(
            {
            mongoUrl: 'mongodb://localhost/codeal_devlopment',
            autoRemove: 'disabled'
         },
         function(err){
             console.log(err || 'connect-mongodb setup ok');
         }
        )
    }));
    
    app.use(passport.initialize());
    app.use(passport.session());
    
    app.use(passport.setAuthenticatedUser);
    
    
    // use express router
    app.use('/', require('./routes/'));
    
    
    // listening to the port
    app.listen(port, function(err){
    
        // console.log('error ', err); 
        // we can write the same things as below known as interpolation
        if (err){
        console.log(`error while connecting to server: ${err}`);
        }
        console.log(`sucess, server running on the port: ${port}`);
    });
    

    【讨论】:

    • 我的理解是使用passport-local-mongoose,cookie是自动创建的。我用一个独立的应用程序进行了测试,cookie 是自动创建的。但是,当我将应用程序信息分解为客户端部分(在 localhost:3000 上反应应用程序)和服务器部分(localhost:5000)时,不会创建 cookie。在这种情况下,我不明白 cookie 创建是如何工作的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-19
    • 2019-10-05
    • 2018-07-31
    • 2021-05-24
    • 2016-06-21
    • 1970-01-01
    • 2017-04-02
    相关资源
    最近更新 更多