使用JWT保护安全的API验证客户端

时间:2019-07-24 08:27:39

标签: rest security jwt

我有一个使用JWT进行身份验证的RESTful API。我从客户端收到的第一个呼叫是/ login呼叫,具有以下有效负载(无标头)

{
     "username" : xxxx,
     "password": wwww
}

服务器验证用户是否已注册,然后将签名的JWT返回给客户端,以便在下一次调用中被接收。

我想知道这是否足够安全。我不会在任何地方检查客户端是否向我发送了客户端ID /客户端密码(例如在OAuth中),因此我无法验证此调用是否来自我的webapp / apps或它是否是我不知道的外部客户端。我想知道使用JWT实现此行为是否有意义以及如何实现。

(我知道如何使用OAuth2进行此操作,但现在我不想从JWT身份验证中删除)

谢谢!

2 个答案:

答案 0 :(得分:0)

如果我对您的理解正确,则应该创建一个与此类似的函数:

function verify(req, res, next) {
   const token = req.header('x-auth-token');

   if (!token) {
       return res.status(401).json({
           msg: 'No token, auth denied'
       });
  }

   try {
       const decoded = jwt.verify(token, config.get(YOUR_SECRET_GOES_HERE));
       req.user = decoded.user;
       next();
   } catch (err) {
       res.status(401).json({
           msg: 'Token is not valid'
       });
   }
}

对于所有安全的API端点,您都应该这样应用它:

router.get('/anyuserinfo', verify, (req, res) => ... 

就是这样。如果没有提供令牌,该函数将发送401响应。

答案 1 :(得分:0)

我想我发现了另一个可以回答我的Stackoverflow问题: JWT (Json Web Token) Audience "aud" versus Client_Id - What's the difference?

简而言之,在发送新的JWT令牌之前,应在标头上将client_id和client_secret发送到要验证的服务器。