📜  令牌验证 nodejs - Javascript (1)

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

令牌验证 NodeJS - Javascript

令牌验证在现代 Web 应用程序中越来越受欢迎,特别是在移动应用程序中。NodeJS 是一个强大的平台,可以提供各种令牌验证方案。本文将让你了解令牌验证,并提供一些示例代码。

什么是令牌验证?

令牌验证是指验证用户的身份是否得到授权。令牌验证可以通过多种方式实现,但最常见的方式是使用 JSON Web 令牌(JWT)。JWT 是目前最受欢迎的令牌验证方案之一。它允许你在用户和服务器之间传递被加密的信息,以验证用户的身份和权限。

如何实现令牌验证?

JWT 由三部分组成:

  1. 头部(Header):包含 JWT 类型和加密算法
  2. 负载(Payload):包含用户信息和其他数据
  3. 签名(Signature):加密负载(Payload)和头部(Header),以验证令牌的真实性

下面是一个示例 JWT,它包含了一个用户 ID 和一个过期时间:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyLCJleHAiOjE1MTYyMzkxMjJ9.SflKxwRJSMeKKF2QT4fwpMeJf36PoVhd

要在 NodeJS 中验证 JWT,首先需要安装 JWT 模块。打开你的终端,运行以下命令:

npm install jsonwebtoken

在你的 NodeJS 应用程序中,需要引入 JWT 模块,并定义一个密钥:

const jwt = require('jsonwebtoken');
const secret = 'mYs3cr3tK3y';

接下来,将要生成一个新的 JWT。首先,定义负载(Payload)数据:

const payload = {
  userId: '12345',
  exp: Math.floor(Date.now() / 1000) + (60 * 60 * 24), // 24 hours in seconds
};

然后,调用 jwt.sign() 方法,生成新的 JWT:

const token = jwt.sign(payload, secret);

现在,token 变量包含 JWT。你可以将它发送回客户端,让客户端存储它,并在发送请求时传递给服务器。

接下来,你需要在 NodeJS 中解析和验证 JWT。解析 JWT 很简单,只需调用 jwt.verify() 方法:

const decoded = jwt.verify(token, secret);

decoded 变量包含解密的 JWT 数据。

要验证 JWT 签名,需要将 jwt.verify()options 参数设置为 {algorithms: ['HS256']},或者使用其他支持的算法。举个例子:

const decoded = jwt.verify(token, secret, { algorithms: ['HS256'] });

如果 JWT 不是有效的令牌,将会抛出错误。你可以使用 try-catch 语句来捕获此类错误:

try {
  const decoded = jwt.verify(token, secret, { algorithms: ['HS256'] });
  console.log(decoded); // 输出解密后的 JWT 数据
} catch {
  console.log('Invalid token');
}
示例代码

下面是完整的令牌验证示例代码:

const jwt = require('jsonwebtoken');

const secret = 'mYs3cr3tK3y';

const generateJwt = () => {
  const payload = {
    userId: '12345',
    exp: Math.floor(Date.now() / 1000) + (60 * 60 * 24), // 24 hours in seconds
  };
  const token = jwt.sign(payload, secret);
  return token;
}

const verifyJwt = (token) => {
  try {
    const decoded = jwt.verify(token, secret, { algorithms: ['HS256'] });
    console.log(decoded);
  } catch {
    console.log('Invalid token');
  }
}

const token = generateJwt(); // 生成 JWT
verifyJwt(token); // 解析和验证 JWT

以上是用 NodeJS 实现令牌验证的基础知识,你可以根据自己的需求进行修改和扩展。在实际应用中,你可以使用第三方身份验证服务,例如 Passport 和 Auth0。