JWT的一些基本问题(服务端和客户端)
Some basic questions about JWT (server and client side)
我正在使用 express.js,具有 jwt 策略的护照,当然还有用于 node.js 的 jsonwebtoken。
因此,目前,我已经设法实现了一个 server-side 逻辑,它使用户能够登录并 returns jwt 令牌。
之后,当我使用 header 中的相应令牌执行获取请求时,它会正确验证 jwt 令牌并显示信息。代码如下:
var jwt = require('jsonwebtoken');
function createToken(user) {
return jwt.sign(user, 'shhhhh', {
issuer: "accounts.examplesoft.com"
});
}
var opts = {};
opts.secretOrKey = 'shhhhh';
opts.issuer = "accounts.examplesoft.com";
passport.use(new JwtStrategy(opts, function(jwt_payload, done) {
console.log(jwt_payload);
User.findById(jwt_payload.id, function(err, user) {
if (err) {
return done(err, false);
}
if (user) {
done(null, user);
} else {
done(null, false);
}
});
}));
app.post('/jwt_login', function(req, res) {
User._loginJwt({
email: req.body.email,
password: req.body.password
}, function(err, user) {
if (err) res.json(err);
else res.json(createToken(user));
});
});
app.get('/jwt_test', passport.authenticate('jwt', {
session: false
}), function(req, res) {
res.json(true);
});
现在我正在尝试创建一个 client-side 页面。我正在使用 angularjs 并且有很多 jwt 库用于 angularjs 或者更确切地说,通常是客户端。现在我有一系列的问题:
- 首先,server-side 实现是否正确(从上面的代码可以看出)?
- 如果我将 jwt 令牌存储在 localStorage 中(在 client-side 上)是否安全?
- 为什么jwt客户端有那么多可用的库?获取令牌然后使用该令牌调用请求还不够吗?我还能在客户端使用该令牌做什么?
- 有人不能只从 localStorage 复制 jwt 令牌并像登录一样发出请求吗?这不是安全问题吗?
感谢您的回复!
- 服务器端实现看起来不错,但可以扩展令牌中的声明。只要始终对令牌进行身份验证就可以了。
- 是的。这就是 JWT 有用的部分原因。如果用户更改令牌,令牌将与其签名不匹配,将无法通过身份验证。
- 据我所知,客户端内容用于在客户端使用的有效负载中传递数据。然后,您还希望能够在那一侧对令牌进行身份验证,这样您的前端就不会做任何不应该做的事情。
一种。如果您只有 RESTful API 来验证带有令牌的请求,那么除了发送请求外,您无需在前端对 JWT 执行任何操作。
- 是的。这就是为什么您的令牌应在其声明中包含到期时间。请记住,进入 LocalStorage 的唯一方法是他们首先登录。
请在此处查看您的令牌中可以包含的声明:
http://self-issued.info/docs/draft-ietf-oauth-json-web-token.html#rfc.section.4
我正在使用 express.js,具有 jwt 策略的护照,当然还有用于 node.js 的 jsonwebtoken。
因此,目前,我已经设法实现了一个 server-side 逻辑,它使用户能够登录并 returns jwt 令牌。
之后,当我使用 header 中的相应令牌执行获取请求时,它会正确验证 jwt 令牌并显示信息。代码如下:
var jwt = require('jsonwebtoken');
function createToken(user) {
return jwt.sign(user, 'shhhhh', {
issuer: "accounts.examplesoft.com"
});
}
var opts = {};
opts.secretOrKey = 'shhhhh';
opts.issuer = "accounts.examplesoft.com";
passport.use(new JwtStrategy(opts, function(jwt_payload, done) {
console.log(jwt_payload);
User.findById(jwt_payload.id, function(err, user) {
if (err) {
return done(err, false);
}
if (user) {
done(null, user);
} else {
done(null, false);
}
});
}));
app.post('/jwt_login', function(req, res) {
User._loginJwt({
email: req.body.email,
password: req.body.password
}, function(err, user) {
if (err) res.json(err);
else res.json(createToken(user));
});
});
app.get('/jwt_test', passport.authenticate('jwt', {
session: false
}), function(req, res) {
res.json(true);
});
现在我正在尝试创建一个 client-side 页面。我正在使用 angularjs 并且有很多 jwt 库用于 angularjs 或者更确切地说,通常是客户端。现在我有一系列的问题:
- 首先,server-side 实现是否正确(从上面的代码可以看出)?
- 如果我将 jwt 令牌存储在 localStorage 中(在 client-side 上)是否安全?
- 为什么jwt客户端有那么多可用的库?获取令牌然后使用该令牌调用请求还不够吗?我还能在客户端使用该令牌做什么?
- 有人不能只从 localStorage 复制 jwt 令牌并像登录一样发出请求吗?这不是安全问题吗?
感谢您的回复!
- 服务器端实现看起来不错,但可以扩展令牌中的声明。只要始终对令牌进行身份验证就可以了。
- 是的。这就是 JWT 有用的部分原因。如果用户更改令牌,令牌将与其签名不匹配,将无法通过身份验证。
- 据我所知,客户端内容用于在客户端使用的有效负载中传递数据。然后,您还希望能够在那一侧对令牌进行身份验证,这样您的前端就不会做任何不应该做的事情。
一种。如果您只有 RESTful API 来验证带有令牌的请求,那么除了发送请求外,您无需在前端对 JWT 执行任何操作。 - 是的。这就是为什么您的令牌应在其声明中包含到期时间。请记住,进入 LocalStorage 的唯一方法是他们首先登录。
请在此处查看您的令牌中可以包含的声明:
http://self-issued.info/docs/draft-ietf-oauth-json-web-token.html#rfc.section.4