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)
被困了几天后我得到了解决方案。
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。
对于其他请求响应库,请访问此答案。
| 归档时间: |
|
| 查看次数: |
7928 次 |
| 最近记录: |