关于 JWT(服务器端和客户端)的一些基本问题
Posted
技术标签:
【中文标题】关于 JWT(服务器端和客户端)的一些基本问题【英文标题】:Some basic questions about JWT (server and client side) 【发布时间】:2015-09-23 15:53:33 【问题描述】:我正在使用 express.js、带有 jwt 策略的护照,当然还有用于 node.js 的 jsonwebtoken。
所以,目前,我已经设法实现了一个服务器端逻辑,它使用户能够登录并返回 jwt 令牌。
之后,当我使用标头中的相应令牌执行获取请求时,它会正确验证 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);
);
现在我正在尝试做一个客户端页面。我正在使用 angularjs,并且有很多用于 angularjs 或者更确切地说是客户端的 jwt 库。现在我有一系列问题:
-
首先,服务器端实现是否正确(从上面的代码可以看出)?
如果我将 jwt 令牌存储在 localStorage(在客户端)中是否安全?
为什么有这么多的库可供 jwt 客户端使用?获取令牌然后使用该令牌调用请求还不够吗?我还能在客户端使用该令牌做什么?
难道不能有人从 localStorage 复制 jwt 令牌并像登录一样发出请求吗?这不是安全问题吗?
感谢您的回复!
【问题讨论】:
【参考方案1】:-
虽然可以扩展令牌中的声明,但服务器端实现看起来不错。只要始终对令牌进行身份验证,就可以了。
是的。这就是 JWT 有用的部分原因。如果用户更改了令牌,它将无法匹配其签名并且将无法通过身份验证。
据我回忆,客户端的内容是用于在客户端使用的有效负载中传递数据时使用的。您还希望能够在该端对令牌进行身份验证,因此您的前端不会做任何不应该做的事情。
一种。如果您只有一个使用令牌验证请求的 RESTful API,那么您无需在前端对 JWT 执行任何操作,只需将其与请求一起发送。
是的。这就是为什么您的令牌应在其声明中包含过期时间。请记住,进入 LocalStorage 的唯一方法是他们一开始就登录。
请参阅此处了解可以在您的令牌中的声明:
http://self-issued.info/docs/draft-ietf-oauth-json-web-token.html#rfc.section.4
【讨论】:
感谢您的快速回复。只是一个问题,您认为哪些声明可以添加到令牌中?此外,如“记住,进入 LocalStorage 的唯一方法是他们一开始就登录”。 - 用户总是可以手动更改localStorage,所以我不会太依赖它。 嗯,您应该始终设置exp
以确保令牌过期。我通常添加我自己的声明,例如 uid
来验证令牌是否与我分配给它的用户匹配。请参阅 #2,了解为什么用户弄乱 JWT 并没有什么大不了的。
是的,我相信我也做了同样的事情,jwt_payload.id
部分。再次感谢!以上是关于关于 JWT(服务器端和客户端)的一些基本问题的主要内容,如果未能解决你的问题,请参考以下文章