在开发 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:
// javascriptcn.com 代码示例 function generateToken(data: Record<string, unknown>): string { const payload: Payload = { data, exp: setExpiration(new Date().getTime() + 1000 * 60 * 60 * 24 * 7) // Token 过期时间为 7 天 }; const header: Jose = { alg: "HS256", typ: "JWT" }; const secret: string = "my-s3cr3t-k3y"; // 签名密钥 return makeJwt({ header, payload, secret }); }
在这个函数中,我们通过 makeJwt
函数生成 JWT,header
对象指定了加密算法和 JWT 的类型,payload
对象是 JWT 的负载。
验证 JWT
除了生成 JWT,我们还需要编写函数来验证 JWT。使用 djwt
库来验证 JWT 很方便,示例代码如下:
// javascriptcn.com 代码示例 import { validateJwt } from "https://deno.land/x/djwt/validate.ts"; function verifyToken(token: string): { isValid: boolean, payload: any } { const secret: string = "my-s3cr3t-k3y"; // 签名密钥 let result = { isValid: false, payload: null }; try { result.payload = validateJwt(token, secret); result.isValid = true; } catch (error) { console.error(error); } return result; }
在这个函数中,我们通过 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