javascript - 使用令牌在后端和前端识别用户进行身份验证
问题描述
我想使用 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 发送给客户端?您是否将其与令牌一起存储到本地浏览器存储中并在删除令牌时将其删除?
也许我弄错了,但目前我只知道如何检查某人是否经过身份验证,但不知道是哪一个。客户端需要知道当前登录的是哪个用户。
解决方案
生成一个新的令牌并发送给客户端。我是否也必须将用户对象发送给客户端?因为目前我只检查用户是否经过身份验证而不是哪个用户。
从技术上讲,您还可以发送用户对象(和任何其他信息),但通常您想要发回的只是 jwt 令牌,因为它包含您在客户端需要的所有信息(有效负载)。
那么您是否也会将用户 ID 发送给客户端?
与上一个答案相同,如果您需要客户端的用户 ID,请将其包含在 jwt 有效负载中。
您是否将其与令牌一起存储到本地浏览器存储中并在删除令牌时将其删除?
如果您需要它作为永久的东西(页面重新加载)它们是的,请将 jwt 令牌或其他任何东西保存到本地存储中。
也许我弄错了,但目前我只知道如何检查某人是否经过身份验证,但不知道是哪一个。客户端需要知道当前登录的是哪个用户。
您正在寻找的是您在服务器端检查的用户授权(而不是身份验证)。
推荐阅读
- sql - 使用 Advantage 数据库的免费连接不支持链接对象
- c# - 列表视图项模板中的选中复选框未存储
- ios - 使用 Mapkit 和 Swift 添加带有行车路线的完整注释视图
- json - 有没有办法在 JSON 文件的开头插入一个节点?
- groovy - 异步测试是否已调用远程方法
- javascript - 我如何制作解码器和编码器?
- python - 如何将 X 的预测插入 BernoulliNB.predict_proba?
- r - 我正在尝试将正态分布的结果与未知 df 值的 t 分布进行比较
- c# - 跳过csv中的第一个拆分字符
- pyspark - 根据 PySpark 中另一个数据框的列值的值更新列中的值