关于 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(服务器端和客户端)的一些基本问题的主要内容,如果未能解决你的问题,请参考以下文章

JWT简介

openssh服务器端和客户端的配置及应用

Socket(套接字)在服务器端和客户端之间的基本工作原理

Socket(套接字)在服务器端和客户端之间的基本工作原理

spring boot - 假装客户端发送基本授权标头|将 jwt 令牌从一个微服务传递到另一个微服务

tcp 服务端和客户端程序设计