📌  相关文章
📜  使用 Node.js 进行 JWT 身份验证(1)

📅  最后修改于: 2023-12-03 15:06:49.042000             🧑  作者: Mango

使用 Node.js 进行 JWT 身份验证

JWT (JSON Web Tokens) 是一种轻量级的身份验证方式,可以在 Web 应用程序中用于安全地传输信息。JWT 包含有关用户身份验证和授权信息的数字签名,以确保传输过程中的数据完整性和安全性。在 Node.js 中,可以使用 jsonwebtoken 模块来生成和验证 JWT。

安装 jsonwebtoken

使用以下命令安装 jsonwebtoken 模块:

npm install jsonwebtoken --save
创建 JWT

使用以下代码示例创建 JWT:

const jwt = require('jsonwebtoken');

const secret = 'YourSecretKey';
const payload = { username: 'exampleUser' };
const token = jwt.sign(payload, secret, { expiresIn: '1h' });

console.log(token);

在此示例中,我们使用 jsonwebtoken 模块的 sign 方法生成 JWT。 payload 对象是要包含在 JWT 中的信息。 secret 参数是用于加密 JWT 的密钥。 expiresIn 参数指定 JWT 的有效期时间(这里是 1 小时)。

输出将是包含 JWT 的字符串。

验证 JWT

使用以下代码示例验证 JWT:

const jwt = require('jsonwebtoken');

const secret = 'YourSecretKey';
const token = 'YourJWTToken';

jwt.verify(token, secret, (err, decoded) => {
  if (err) {
    console.log('Token Verification Failed');
    console.log(err);
  } else {
    console.log('Token Verified');
    console.log(decoded);
  }
});

在此示例中,我们使用 jsonwebtoken 模块的 verify 方法验证 JWT。 token 参数是要验证的 JWT 字符串。 secret 参数是用于解密 JWT 的密钥。

verify 方法将检查 JWT 是否已签名,并验证签名'是否与密钥匹配。 如果 JWT 验证成功,则将调用回调函数,并将解码的 JWT 数据作为参数传递给它。

在应用程序中使用 JWT

在 Web 应用程序中,通常会将 JWT 存储在客户端(例如,浏览器的 localStorage),然后在每个 HTTP 请求中通过 HTTP 标头发送它。服务器将会验证 JWT,以确认请求时的用户身份验证和授权信息。

例如,以下代码片段演示了如何使用 JWT 进行 Express.js 中间件身份验证:

const jwt = require('jsonwebtoken');

const secret = 'YourSecretKey';

function authenticate(req, res, next) {
  const token = req.headers.authorization;

  if (!token) {
    res.status(401).send('Unauthorized: No token provided');
  } else {
    jwt.verify(token, secret, (err, decoded) => {
      if (err) {
        res.status(401).send('Unauthorized: Invalid token');
      } else {
        req.username = decoded.username;
        next();
      }
    });
  }
}

app.get('/protected', authenticate, (req, res) => {
  res.send(`Welcome ${req.username}!`);
});

在此示例中,中间件 authenticate 将验证 HTTP 请求标头中的 JWT。如果 JWT 有效,则将用户的 username 添加到请求对象,并将请求传递给下一个中间件。否则,将发送未授权错误消息。在 /protected 路由中,req.username 将包含验证的用户身份验证信息并在响应中使用。