无法在快速会话中保存 cookie

Muk*_*pta 2 javascript cookies session node.js express

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

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

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

3.在此获取请求中,我想检查该用户是否有活动会话,这样即使有人使用 URL:profile/some_user_id,它也始终会检查活动会话。

我的问题是:

1.我是否需要显式地将 cookie 发送给客户端(如果是),那么express-session 将如何为我做到这一点。

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

我的应用程序.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");
})
Run Code Online (Sandbox Code Playgroud)

我的护照.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);
        });
    }); 
Run Code Online (Sandbox Code Playgroud)

'/login' post 请求中的 console.log(req.session) 。

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
  }
}
Run Code Online (Sandbox Code Playgroud)

console.log(请求.会话)

'/user/:id' getrequest 中的 console.log(req.session.user)。

Session {
  cookie: {
    path: '/',
    _expires: 2020-07-03T18:44:57.514Z,
    originalMaxAge: 3600000,
    httpOnly: true,
    secure: false
  }
}
undefined
Run Code Online (Sandbox Code Playgroud)

Muk*_*pta 9

被困了几天后我得到了解决方案。

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

req.session.user = userLoggedIn;
Run Code Online (Sandbox Code Playgroud)

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

req.session.user
Run Code Online (Sandbox Code Playgroud)

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

要使其正常工作,您需要明确告诉 Express 应用程序中的 cors() 是否应使用 cookie 等凭据发出跨站点访问控制请求以及将 cookie 发送到何处。

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

服务器端

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

客户端(如果使用 axios)

axios.method('url', data(if needed), {withCredentials: true})
Run Code Online (Sandbox Code Playgroud)

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

对于其他请求响应库,请访问此答案