如何使用 JWT 认证 RESTful API

阅读时长 4 分钟读完

什么是 JWT

JWT 是一种基于 JSON 的开放标准,用于在各方之间安全地传输声明。JWT 可以被用于认证和授权。它在使用上很简单,可以单独使用或与其他认证方法结合使用。

JWT 由三部分组成:Header(头)、Payload(载荷)和 Signature(签名)。Header 包含了 JWT 的类型以及算法信息,Payload 包含了 JWT 所要传递的信息(例如用户 ID、角色等),Signature 基于 Header 和 Payload 以及一个秘钥生成,用来验证 JWT 的合法性。

以下是一个示例 JWT:

1. 登录

客户端本地使用用户名和密码进行登录。服务器会验证身份并颁发 JWT,一般将其存储在客户端的 localStorage 中。

以下是一个示例代码:

前端代码:

后端代码:

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

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

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

2. 携带 JWT 请求 API

客户端在请求 API 时,需要在请求头 Authorization 中附带 JWT。

以下是一个示例代码:

前端代码:

后端代码:

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

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

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

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

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

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

3. JWT 的更新与注销

JWT 有一个过期时间(exp),当过期时间到达后,需要客户端重新获取 JWT。当用户需要注销时,需要删除客户端本地的 JWT。

以下是相关示例代码:

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

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

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

总结

本文介绍了 JWT 的作用、使用方法以及在 RESTful API 中的应用。JWT 的优点之一是无状态,即服务器不需要存储任何 session 或 token,从而极大地减轻了服务器的负担。同时,JWT 也支持跨域使用,使得基于前端的 SPA 等应用的请求更加灵活,安全。

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

纠错
反馈