在前后端分离的应用中,如何进行身份认证一直是一个重要的问题。JWT(JSON Web Token)是一种常用的身份认证方式,它可以在请求头或 cookie 中保存身份信息,并且具有分布式、不需要在服务器端保存令牌、扩展性好等优点。在本文中,我们将介绍如何在 Express.js 应用中使用 JWT 实现 Token 认证。
JWT 原理
JWT 由头部、载荷和签名组成:
- 头部 包含了令牌类型和使用的哈希算法
- 载荷 存储了用户的身份信息,例如用户名、用户 ID 等
- 签名 是对头部和载荷进行哈希计算得到的字符串,用于验证令牌在传输过程中是否被篡改
对于服务端,它需要在用户登录成功后生成一个 JWT,并将其返回给客户端。客户端在后续的请求中需要将 JWT 包含在请求头或 cookie 中,服务端接收到请求后需要验证 JWT 的合法性。
安装依赖
在 Express.js 应用中使用 JWT 需要安装以下两个依赖:
--- ------- ------------ -----------
其中 jsonwebtoken
用于生成和验证 JWT,express-jwt
是一个 Express.js 中使用 JWT 的中间件。
生成和验证 JWT
下面是一个生成 JWT 的示例代码:
----- --- - ------------------------ ----- ----- - ---------- ------- --- -- ------------ - ---------- ---- --- ------------------- -- -------------------------------------------------------------------------------------------------------------------------------------------------
jwt.sign()
方法接收三个参数:
- payload 包含了需要存储的用户信息
- secret 用于生成签名的密钥,不能暴露给客户端
- options 包含了过期时间和其它可选参数
下面是一个验证 JWT 的示例代码:
----- --- - ------------------------ ----- ----- - ---------------------------------------------------------------------------------------------------------------------------------------------------- ----------------- ------------ ------------- -------- - ---------------- --------- -- ---------- ------ ------- ---------- ---
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