【问题标题】:Cannot save cookie in express-session无法在快速会话中保存 cookie
【发布时间】:2020-10-20 18:46:31
【问题描述】:

我正在创建一个用于注册、登录的小型 MERN 应用,成功登录后,它会显示他们的个人资料。

1.我希望用户登录,如果登录成功,我会将 user._id 发送到 react 应用并将其重定向到 profile/user._id

2.在 ComponentDidMount 方法的配置文件页面上,我将使用它的 user._id 执行 get-request 以从我的服务器获取用户数据。

3.在这个get-request中,我想检查这个用户是否有一个活跃的会话,这样即使有人使用一个URL:profile/some_user_id,它也会总是检查一个活跃的会话。

我的问题是:

1.如果是,我是否需要明确地将 cookie 发送给客户端,那么如何或 express-session 将为我完成。

2.在解决1之后,当我执行/profile/id get-request 时,如何在会话中访问此保存的数据。

我的 app.js

require('./passport')(passport);

app.use(cookieParser());
//Express session
app.use(
    session({
      secret: 'secret',
      resave: true,
      saveUninitialized: false,
      cookie: { maxAge: 60*60*1000 },
    })
);

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


app.post('/login', (req, res, next) => {
    passport.authenticate('local', (err, user, info) => {
        if(err) {
            res.status(203).send(err);
        } else {
            if(user) {
                req.login(user, err => {
                    req.session.user = user;
                    console.log(req.session);
                    res.status(200).send(user._id);
                })
            } else {
                res.status(202).send(info);
            }
        }
    })(req, res, next);
});

app.get('/profile/:id', (req, res, next) => {
    const id = req.params.id;
    console.log(req.session);
    res.send("session is running");
})

我的护照.js

passport.use(
        new LocalStrategy({usernameField: 'email', passwordField: 'password'}, (email, password, done) => {
            // Match User
            User.findOne({email: email}, (err, user) => {
                    if(err) {
                        return done(err);
                    }
                    if(!user) {
                        return done(null, false, { msg: 'Input data incorrect!'})
                    }
                    // Match Password
                    bcrypt.compare(password, user.password, (err, isMatch) => {
                        if(err) throw error;
                        if(isMatch) {
                            return done(null, user);
                        } else {
                            return done(null, false, { msg: "Input data incorrect!"})
                        }
                    });
                })
        }) 
    );
    
    passport.serializeUser((user, done) => {
        done(null, user.id);
      });
      
    passport.deserializeUser((id, done) => {
        User.findById(id, (err, user) => {
            done(err, user);
        });
    }); 

console.log(req.session) 在“/login”发布请求中。

Session {
  cookie: {
    path: '/',
    _expires: 2020-07-03T18:44:55.179Z,
    originalMaxAge: 3600000,
    httpOnly: true,
    secure: false
  },
  passport: { user: '5ef7a8b55570c353bc1aef12' },
  user: {
    _id: 5ef7a8b55570c353bc1aef12,
    email: 'mukeshgupta202000@gmail.com',
    userName: 'asdd',
    password: '$2b$10$wzF6uwxcFNHgi4NdNBL5A.wEAs4W14zQ8YpEboPJWttvRaIO6MXCq',
    createdAt: 2020-06-27T20:14:45.303Z,
    updatedAt: 2020-06-27T20:14:45.303Z,
    __v: 0
  }
}

console.log(req.session)

console.log(req.session.user) 在“/user/:id”getrequest 中。

Session {
  cookie: {
    path: '/',
    _expires: 2020-07-03T18:44:57.514Z,
    originalMaxAge: 3600000,
    httpOnly: true,
    secure: false
  }
}
undefined

【问题讨论】:

    标签: javascript node.js express session cookies


    【解决方案1】:

    卡了几天后,我得到了解决方案。

    1. 不,您不需要将 cookie 显式发送到您的客户端,但您需要自己保存用户数据。

    req.session.user = userLoggedIn;
    

    2. 要在不同的路径中访问此 userLoggedIn 数据,您需要使用相同的对象:

    req.session.user
    

    上述代码不起作用的原因是因为 CORS。

    要使其正常工作,您只需明确告诉您的 express 应用程序中的 cors() 是否应使用 cookie 等凭据以及发送位置来发出跨站点访问控制请求饼干。

    这可以通过以下代码来完成:

    服务器端

    const corsOptions = {
        origin: 'http://localhost:3001',  //Your Client, do not write '*'
        credentials: true,
    };
    app.use(cors(corsOptions));
    

    客户端(如果使用 axios)

    axios.method('url', data(if needed), {withCredentials: true})
    

    这将告诉浏览器在每个请求上发送 cookie。

    有关其他请求-响应库,请访问this answer

    【讨论】:

      猜你喜欢
      • 2017-11-26
      • 2022-08-21
      • 1970-01-01
      • 1970-01-01
      • 2014-03-24
      • 2021-10-22
      • 1970-01-01
      • 2016-08-08
      • 2019-03-14
      相关资源
      最近更新 更多