【发布时间】:2019-07-31 20:05:48
【问题描述】:
我想使用 Json Web Tokens 创建一个简单的 Express API。当用户尝试登录时,我会执行此操作
exports.signIn = async (req, res, next) => {
const { username, password } = req.body;
// get user from database
const userQueryResult = await userQueries.getUserByName([username]);
// return if database errors occured
if (userQueryResult.err) {
res.status(500).json({
message: userQueryResult.err.message
});
}
const users = userQueryResult.result;
const user = users[0];
// no user found
if (!user) {
res.status(401).json({
message: 'Auth failed'
});
}
try {
// validate the password
const passwordMatch = bcrypt.compareSync(password, user.passwordHash);
// wrong credentials
if (!passwordMatch) {
res.status(401).json({
message: 'Auth failed'
});
}
const token = jwt.sign({
user.id
}, tokenSecret, {
tokenExpiration
});
res.status(200).json({
message: 'Auth succeeded',
token
});
} catch (err) {
res.status(401).json({
message: 'Auth failed'
});
}
};
生成一个新令牌并发送给客户端。我是否也必须将用户对象发送给客户端?因为目前我只检查用户是否经过身份验证,而不是哪个。
对于受保护的路由,我检查用户是否使用中间件功能进行了身份验证
module.exports = (req, res, next) => {
try {
const rawToken = req.headers.authorization; // bearer <token>
const token = rawToken.split(' ')[1]; // extract the token
req.userData = jwt.verify(token, tokenSecret); // verify this token
next();
} catch (error) {
res.status(401).json({
message: 'Auth failed'
});
}
}
那么您是否也将用户 ID 发送给客户端?是否将其与令牌一起存储到本地浏览器存储中,并在删除令牌时将其删除?
也许我弄错了,但目前我只知道如何检查某人是否通过了身份验证,但不知道是哪一个。客户端需要知道当前登录的是哪个用户。
【问题讨论】:
标签: javascript node.js express authentication jwt