在前后端分离的应用中,如何进行身份认证一直是一个重要的问题。JWT(JSON Web Token)是一种常用的身份认证方式,它可以在请求头或 cookie 中保存身份信息,并且具有分布式、不需要在服务器端保存令牌、扩展性好等优点。在本文中,我们将介绍如何在 Express.js 应用中使用 JWT 实现 Token 认证。
JWT 原理
JWT 由头部、载荷和签名组成:
- 头部 包含了令牌类型和使用的哈希算法
- 载荷 存储了用户的身份信息,例如用户名、用户 ID 等
- 签名 是对头部和载荷进行哈希计算得到的字符串,用于验证令牌在传输过程中是否被篡改
对于服务端,它需要在用户登录成功后生成一个 JWT,并将其返回给客户端。客户端在后续的请求中需要将 JWT 包含在请求头或 cookie 中,服务端接收到请求后需要验证 JWT 的合法性。
安装依赖
在 Express.js 应用中使用 JWT 需要安装以下两个依赖:
npm install jsonwebtoken express-jwt
其中 jsonwebtoken
用于生成和验证 JWT,express-jwt
是一个 Express.js 中使用 JWT 的中间件。
生成和验证 JWT
下面是一个生成 JWT 的示例代码:
const jwt = require('jsonwebtoken'); const token = jwt.sign({ userId: 123 }, 'secretKey', { expiresIn: '1h' }); console.log(token); // eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjEyMywiZXhwIjoxNjIwMjgzMzM2LCJpYXQiOjE2MDE2MTUzNzZ9.7U6NaOwWGlc97Tpnv3qWk7_9XIODzA4DOY4Z3q4IRdQ
jwt.sign()
方法接收三个参数:
- payload 包含了需要存储的用户信息
- secret 用于生成签名的密钥,不能暴露给客户端
- options 包含了过期时间和其它可选参数
下面是一个验证 JWT 的示例代码:
const jwt = require('jsonwebtoken'); const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjEyMywiZXhwIjoxNjIwMjgzMzM2LCJpYXQiOjE2MDE2MTUzNzZ9.7U6NaOwWGlc97Tpnv3qWk7_9XIODzA4DOY4Z3q4IRdQ'; jwt.verify(token, 'secretKey', function(err, decoded) { console.log(err, decoded); // 如果验证失败,err 不为空;否则 decoded 包含了存储的用户信息 });
jwt.verify()
方法接受三个参数:
- token 需要验证的 JWT
- secret 用于验证签名的密钥
- callback 在验证完成后的回调函数,接收两个参数:err 和 decoded,其中 decoded 包含了存储的用户信息
创建 JWT 中间件
为了在 Express.js 应用中使用 JWT,我们需要使用 express-jwt
模块创建一个 JWT 中间件。下面是一个基础的示例代码:
-- -------------------- ---- ------- ----- --- - ----------------------- ----- ------------- - ----- ------- ----------- --- --------------- -------------- ------------- ---- ----- - -- -- --- ---------------- -- ---------------- -------- ---- ---------------- --------- ---
express-jwt
模块可以接受一个包含如下参数的对象:
- secret 用于验证签名的密钥
- algorithms 可选参数,包含了可用的哈希算法
- getToken 可选参数,指定如何从请求中获取 JWT
- credentialsRequired 可选参数,指定是否要求 JWT 在请求中必须存在
总结
通过本文,我们了解了在 Express.js 应用中使用 JWT 实现 Token 认证的基本原理和步骤。具体来说,我们需要安装 jsonwebtoken
和 express-jwt
两个依赖,并使用它们来生成和验证 JWT,以及创建 JWT 中间件。使用 JWT 可以让我们在分布式应用中方便地进行身份认证,提高了应用的安全性和可扩展性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64c244ab83d39b488164935a