Java 在何处控制JWT
我正在使用android、nodeJS和postgreSQL(sequelize)构建一个客户机-服务器应用程序,我已经能够进行简单的登录和注册,但我想保存会话,所以我这样做了:Java 在何处控制JWT,java,android,json,node.js,jwt,Java,Android,Json,Node.js,Jwt,我正在使用android、nodeJS和postgreSQL(sequelize)构建一个客户机-服务器应用程序,我已经能够进行简单的登录和注册,但我想保存会话,所以我这样做了: router.post('/login', function (req, res, next) { if (JSON.stringify(req.body) == "{}") { return res.status(400).json({ Error: "Login request body is empty"
router.post('/login', function (req, res, next) {
if (JSON.stringify(req.body) == "{}") {
return res.status(400).json({ Error: "Login request body is empty" });
}
if (!req.body.username || !req.body.password) {
return res.status(400).json({ Error: "Missing fields for login" });
}
// search a user to login
User.findOne({ where: { username: req.body.username } }) // searching a user with the same username and password sended in req.body
.then(function (user) {
if (user && user.validPassword(req.body.password)) {
//return res.status(200).json({ message: "loged in!" }); // username and password match
var payload = { user: user };
// create a token
var token = jwt.sign(payload, 'superSecret', {
expiresIn: 60 * 60 * 24
});
// return the information including token as JSON
res.json({
success: true,
message: 'Enjoy your token!',
token: token
});
}
else {
return res.status(401).json({ message: "Unauthorized" }); // if there is no user with specific fields send
}
}).catch(function (err) {
console.error(err.stack)
return res.status(500).json({ message: "server issues when trying to login!" }); // server problems
});
}))
正如你们所看到的,当登录成功时,我将令牌返回给客户端,在客户端,我将令牌保存在SharedReferences上
我的缺点是令牌有一个过期时间,所以我如何控制令牌的过期时间,应该在服务器端还是在客户端控制它
任何提示都是有用的。
首先谢谢,使用令牌方法和会话方法是不同的。令牌在客户端提供,因此您可以将其发送到服务器端,并验证令牌是否已过期 因此,您可以在服务器端执行类似的操作,以检查令牌是否仍然可用或已过期
jwt.verify(token, 'shhhhh', function(err, decoded) {
if (err) {
/*
err = {
name: 'TokenExpiredError',
message: 'jwt expired',
expiredAt: 1408621000
}
*/
}
});
对于登录,您的代码是正确的,但是一旦用户拥有具有过期日期的令牌,您就必须在每个请求中询问令牌是否有效且未过期。因此,首先登录用户,然后在每个请求中询问用户令牌是否有效
例如:
router.get('/posts', function(req, res){
// here you verify the token
// if (err)
// return err, show login to the user
// else, get all post from database and return the data to the user
})
但是,如果您创建了一个可以在您从客户机发出的每个私人请求中使用的函数,则效果会更好
function validateToken(token){
jwt.verify(token, 'shhhhh', function(err, decoded) {
if (err) {
/*
err = {
name: 'TokenExpiredError',
message: 'jwt expired',
expiredAt: 1408621000
}
*/
}
}
示例:使用私有请求并在发出请求之前验证令牌(如果validateToken返回true,它将转到函数,否则,请求将在该点中断):
谢谢你的回答,我有一个问题,是存储一个会话还是仅仅是android应用程序的令牌更好?我真的不知道你是否可以在android中存储会话。但是我相信你可以将令牌存储在SharedReferences中,因为de-app是唯一可以访问该首选项的,所以存储令牌是安全的,而且使用起来也很方便!。如果这个答案是正确的,请把它标记为那样!!我将其标记为asnwer,但例如,我是否需要在登录后发出请求,以解码我从登录中获得的令牌?您必须在对api发出的每个请求上创建一个中间件函数,并验证用户是否拥有令牌以及令牌是否为有效令牌。如果这是真的,请求将转到您后端的控制器,如果无效,您必须请求用户再次登录!所以在登录后,我需要检查该令牌以获取用户,我需要在那里执行另一个请求,对吗?
router.get('/posts', validateToken, function(req, res){
// get all post from database and return the data to the user
}