在开发 Web 应用程序时,身份验证和授权是不可避免的一部分。JSON Web Token(JWT)是一种广泛使用的身份验证协议,它提供了方便的方式来验证客户端的身份,并为用户授予相应的权限。本文将介绍使用 Deno 编写 JWT 认证和用户权限控制的方法。
JWT 认证
JWT 是一种轻量级的协议,用于基于 JSON 数据形式安全传输信息。它包含了发送方和接收方之间的一组声明。在 JWT 认证中,服务器会生成一个 JWT,然后该 JWT 将被发送到客户端,客户端可以使用它来访问受保护的资源。
JWT 的结构
一个 JWT 由三部分组成:
header.payload.signature
其中,header 是一个对象,包含了 JWT 的类型和加密算法信息,payload 是负载,它包含了声明信息,signature 是对 header 和 payload 进行签名后的结果。下面是一个示例 JWT:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
使用 Deno 实现 JWT 认证
使用 Deno 实现 JWT 认证需要用到一个库,叫做 djwt
。首先,我们需要通过 import
语句引入该库:
import { makeJwt, setExpiration, Jose, Payload } from "https://deno.land/x/djwt/create.ts";
然后,我们可以定义一个函数 generateToken
用于生成 JWT:
-- -------------------- ---- ------- -------- ------------------- -------------- ---------- ------ - ----- -------- ------- - - ----- ---- ----------------- ---------------- - ---- - -- - -- - -- - -- -- ----- ----- - - -- ----- ------- ---- - - ---- -------- ---- ----- -- ----- ------- ------ - ---------------- -- ---- ------ --------- ------- -------- ------ --- -
在这个函数中,我们通过 makeJwt
函数生成 JWT,header
对象指定了加密算法和 JWT 的类型,payload
对象是 JWT 的负载。
验证 JWT
除了生成 JWT,我们还需要编写函数来验证 JWT。使用 djwt
库来验证 JWT 很方便,示例代码如下:
-- -------------------- ---- ------- ------ - ----------- - ---- --------------------------------------- -------- ------------------ -------- - -------- -------- -------- --- - - ----- ------- ------ - ---------------- -- ---- --- ------ - - -------- ------ -------- ---- -- --- - -------------- - ------------------ -------- -------------- - ----- - ----- ------- - --------------------- - ------ ------- -
在这个函数中,我们通过 validateJwt
函数来验证 JWT,并返回一个对象,其中包含了 JWT 的有效性和其负载。
用户权限控制
一旦我们成功地实现了 JWT 认证,下一步就是使用 JWT 来控制用户的权限。在 JWT 的负载中,我们可以包含用户的角色或权限信息,并在服务器端对这些信息进行检查,从而限制用户的访问权限。
在 JWT 负载中包含用户信息
在生成 JWT 时,我们可以将用户的 ID、用户名和角色等信息作为负载,例如:
const userData = { id: 123, name: "Tom", role: "user" }; const token = generateToken(userData);
在服务器端验证用户权限
一旦客户端发送了包含 JWT 的请求,服务器可以解码 JWT 并检查其中包含的用户信息,以确定用户是否有足够的权限来访问所请求的资源。下面是一个示例函数,用于验证用户的权限:
function checkAccess(token: string, roles: string[]): boolean { const { isValid, payload } = verifyToken(token); if (!isValid) { return false; } const userRole = payload?.data?.role; return roles.some(role => role === userRole); // 如果用户拥有指定的角色,则返回 true,否则返回 false }
在这个函数中,我们首先调用 verifyToken
函数,以验证 JWT 的有效性。如果 JWT 无效,我们直接返回 false
。否则,我们获取负载中包含的用户角色信息,并将它和 roles
数组中的值进行比较。如果用户拥有指定的角色,则返回 true
,否则返回 false
。
总结
使用 Deno 来实现 JWT 认证和用户权限控制非常简单,只需要使用 djwt
库即可。在生成 JWT 时,我们可以将用户信息作为负载,并在服务器端通过解码 JWT 来验证用户的角色和权限。这种方法使得我们可以在无状态的 Web 应用程序中轻松地实现安全的身份验证和授权机制。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6541dcfc7d4982a6ebb7a69c