RESTful API 的 JWT 认证方法

阅读时长 4 分钟读完

在开发 Web 应用时,RESTful API 是不可避免的一部分。而对于 API 的安全认证,JWT 成为了一个较为流行的方法。本文将介绍 JWT 认证方法,其实现原理以及如何在前端应用中应用。

什么是 JWT

JWT,全称为 JSON Web Token,是一种基于 JSON 格式的轻量级认证和授权协议,用于在网络上传递身份信息和声明的一种标准方法。JWT 由三部分组成,分别是 Header、Payload 和 Signature。

Header

Header 包含了两部分信息:token 的类型和算法。例如:

其中,alg 表示签名的算法,"HS256" 表示 HMAC-SHA256 算法;typ 表示 token 的类型,"JWT" 表示 JWT。

Payload

Payload 是存放用于验证的信息的地方,包含了一些声明和用户数据。例如:

其中,sub 表示用户唯一标识,name 表示用户姓名,iat 表示 token 的签发时间。

Signature

Signature 表示对 Header 和 Payload 的签名,用于验证 token 是否被篡改过。例如:

其中,"." 表示连接符。secret 为一个密钥,用于生成 Signature。Secret 必须保证安全,不能外泄。

如何使用 JWT 实现认证

生成 JWT

在服务器端生成 JWT 时,需要按照一定的规则生成 Header、Payload 和 Signature。以 Node.js 为例:

-- -------------------- ---- -------
----- --- - ------------------------

----- ------ - -----------

----- ------------- - ------ -- -
  ----- ------- - -
    ---- --------
    ----- ----------
    ---- ----------
  --

  ----- ------- - -
    ---------- --------
    ---------- -----
  --

  ------ ----------------- ------- ---------
--

其中,generateToken 函数接收一个 user 对象作为参数,生成包含该用户信息的 token。payload 中的 sub 和 name 均为 user 对象中的属性,iat 表示 token 的签发时间。options 中指定了算法为 HMAC-SHA256,失效时间为 24 小时。

验证 JWT

在前端应用中,需要将生成的 JWT 携带在请求头中,每次请求都需要验证其有效性。以 React 为例:

-- -------------------- ---- -------
------ ----- ---- --------
------ --------- ---- -------------

----- --- - --------------
  -------- --------------------------
---

----- ------------ - ------- -- -
  ----------------------------------------- - ------- ----------
--

----- ----------- - -- -- -
  ----- ----- - ------------------------------
  -- ------- -
    ----- - --- - - -----------------
    ----- -------- - ----- -------------------------
    ------ --------------
  -
  ------ -----
--

authenticate 函数用于将生成的 token 携带到请求头中,格式为 "Bearer [token]"。getAuthUser 函数用于获取当前认证用户,先从 localStorage 中读取 token,然后解码出其中的 sub 值,再通过 API 请求获取该用户信息。

总结

JWT 是一种较为流行的认证和授权协议,其简洁、安全、可扩展的特点受到了广泛的应用和推崇。在前端应用中,我们可以使用 JWT 进行身份验证和授权,从而保障 API 的安全性。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/646b1b06968c7c53b0a88df8

纠错
反馈