如何在 Deno 中使用 JWT Authentication?

阅读时长 8 分钟读完

随着 Deno 的不断发展,越来越多的开发者开始使用它来构建后端服务。在这些服务中,身份验证被认为是最基本的需求之一。其中,JWT Authentication 往往是一种常见的身份认证方式。那么,在 Deno 中如何使用 JWT Authentication 呢?本文将为你详细介绍。

什么是 JWT Authentication?

JWT (JSON Web Token) 是一种用于身份验证的标准,可以在我们和客户端之间安全地传递数据。它由三部分组成:头部、载荷和签名。在使用 JWT Authentication 时,用户提供一些凭据(例如用户名和密码),服务器验证这些凭据是否正确并签发一个 JWT。以后,客户端将使用这个 JWT 来访问受保护的端点。服务器会验证这个 JWT,以确定客户端是否有权访问资源。

Deno 中的 JWT Authentication

要在 Deno 中使用 JWT Authentication,我们需要一些支持。在本文中,我们使用如下三个 Mod:

  • oak:koa 的一个封装,用于创建 Web Server
  • jwt:从 Deno 核心使用 JWT 的库
  • bcrypt:密码散列化库,用于将密码加密

安装 Mod

我们可以使用 deno.land 安装 oak、jwt 和 bcrypt。为了安装这些 Mod,我们需要在命令行中运行以下代码:

我们必须传递 --allow-read--allow-write--allow-net 等选项来授权这些 Mod 执行它们需要的操作。

实现 JWT Authentication

  1. 设置一些环境变量

在这个示例中,我们将从环境变量中获取一些敏感信息,例如数据库地址和 JWT 密钥。因此,我们需要在 .env 文件中设置这些信息。你可以使用以下代码作为示例:

  1. 构建 Express App

我们使用 oak 来创建 Server。我们定义路由、中间件,这些中间件将验证 JWT 和保护受保护的端点。我们将所有内容存储在 main.ts 文件中。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

在这里,我们使用 bcrypt-sha256 可变算法来生成密码哈希。我们使用 makeJwt() 函数和 Deno.env.get() 来构建和签发 JWT。当访问受保护的端点时,我们使用 authMiddleware() 中间件来验证 JWT。如果 JWT 值无效或已过期,则上下文的响应代码将为 401。

结论

在本文中,我们介绍了如何在 Deno 中使用 JWT Authentication。我们使用了一些流行的库,例如 oak、bcrypt、djwt 等。我们创建了一个 Express 应用程序,通过路由和中间件进行身份验证。我希望这篇文章可以帮助你更好地理解 JWT Authentication,并在 Deno 中快速实现它。

参考资料

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

纠错
反馈