Express 无Oauth和自定义令牌方案的基于JWT的认证实现

Express 无Oauth和自定义令牌方案的基于JWT的认证实现,express,authentication,jwt,Express,Authentication,Jwt,我正在开发一个Web API,在这里我实现了基于JWT的身份验证。我既没有使用PasswordJS middlware也没有使用Oauth协议。它基本上是JWTNPM,我用它来签名和验证令牌 代币的整个概念非常清楚,但我对术语“代币方案”非常困惑,无法理解它的用途 我想了解的是:当令牌被发送回服务器进行进一步请求时,我是否需要使用某种排序或自定义的“JWT”方案并验证它,或者这个概念仅由Oauth使用,而我需要的只是发送普通令牌 var accessToken = jwt.sign({

我正在开发一个Web API,在这里我实现了基于JWT的身份验证。我既没有使用PasswordJS middlware也没有使用Oauth协议。它基本上是JWTNPM,我用它来签名和验证令牌

代币的整个概念非常清楚,但我对术语“代币方案”非常困惑,无法理解它的用途

我想了解的是:当令牌被发送回服务器进行进一步请求时,我是否需要使用某种排序或自定义的“JWT”方案并验证它,或者这个概念仅由Oauth使用,而我需要的只是发送普通令牌

var accessToken = jwt.sign({
    userID: user.id,
    isAdmin: user.isAdmin
}, config.userSecret, {
    expiresIn: 600 
});

res.json({
    success: true,
    user: {
        id: user._id,
        name: user.name,
        username: user.username,
        accessToken: 'JWT ' + accessToken, 
    }
});


jwt.verify(accessToken, secret, function(err, token){...}); //throws error when token is passed with the custom scheme

在这种情况下,您使用的具体方案并不重要,因为您正在手动解析授权头的内容

基本上,令牌是通过一个名为Authorization的HTTP头从客户端发送到服务器的。在令牌前面,您要输入方案的名称。因此,授权标头可能如下所示:

Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
允许的名称列表为。对于JWT来说,它通常是不记名的。根据,从技术上讲,您没有遵循OAuth 2.0承载方案,但它通常被称为承载方案

您必须手动获取令牌ey。。。并使用jwt进行验证。验证以获取其有效负载

const headerExists = req.headers.authorization

if (headerExists) {
  let token = req.headers.authorization.split(' ')[1];

  jwt.verify(token, auth.secretjwtkey, function (err, decoded) {
    if (err) {
      res.status(HttpStatus.UNAUTHORIZED).json('Unauthorized');
    } else if (decoded.role === 'admin') {
      next();
    } else {
      res.status(HttpStatus.UNAUTHORIZED).json('Unauthorized');
    }
  })
} else {
  res.status(HttpStatus.FORBIDDEN).json('No token');
}
从上面的示例中间件可以看出,我不关心授权头上的承载字符串,只关心令牌本身。当然,你可以检查它是否是持票人,而不是其他人

所以这个故事的寓意是:

您可以在授权标头上将令牌从客户端发送到服务器。你必须设置前端,这样才能实现。 您可以在允许列表中的令牌或其中一个令牌前面预先发送承载,但建议使用承载。 您可以通过读取授权头上字符串的第二部分来解码令牌,然后将其提供给jwt.verify。
有关详细信息,请参阅。

非常感谢您的详细解释。说得好。