关于JWT的一些基本问题(服务器端和客户端)

时间:2015-07-06 13:15:12

标签: angularjs express passport.js jwt

我正在使用express.js,带有jwt策略的护照,当然还有jsonwebtoken用于node.js。

所以,目前,我已经设法实现了一个服务器端逻辑,它允许用户登录并返回jwt令牌。

之后,当我在头文件中使用相应的令牌执行get请求时,它会正确验证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,并且有很多jwt库用于angularjs,或者更确切地说,客户端。现在我有一系列问题:

  1. 首先,服务器端工具是否正确(从上面的代码可以看出来的内容)?
  2. 如果我将jwt令牌存储在localStorage中(在客户端),是否安全?
  3. 为什么有这么多的库可用于jwt客户端?获取令牌然后使用该令牌调用请求是不够的?我还可以在客户端使用该令牌做什么?
  4. 不能有人只是从localStorage复制jwt令牌并发出请求,好像他们已经登录?这不是一个安全问题吗?
  5. 感谢您的回复!

1 个答案:

答案 0 :(得分:2)

  1. 虽然可以扩展令牌中的声明,但服务器端实现看起来很好。只需始终对令牌进行身份验证即可。
  2. 是。这是JWT有用的部分原因。如果用户更改了令牌,则它将与其签名不匹配,并且将无法通过身份验证。
  3. 根据我的记忆,客户端的内容是用于在客户端上使用的有效负载中传递数据时。您希望能够在那一侧验证令牌,因此您的前端不会做任何不应该做的事情。
    一个。如果您只有一个RESTful API来验证带有令牌的请求,那么除了向请求发送JWT之外,您不必对JWT做任何事情。
  4. 是。这就是为什么您的令牌应在其声明中包含过期的原因。请记住,进入LocalStorage的唯一方法是,如果他们以登录开始。
  5. 请参阅此处了解可能在您的令牌中的声明:

    http://self-issued.info/docs/draft-ietf-oauth-json-web-token.html#rfc.section.4