在前端开发中,用户认证和授权是一个必不可少的部分。JSON Web Token (JWT) 是一种常用的身份验证机制,它使用 JSON 格式并且可以被加密,用于在用户和服务器之间传递信息。在这篇文章中,我们将会探讨如何在 Deno 应用中使用 JWT 进行用户认证和授权。
什么是 JSON Web Token?
JSON Web Token 是通过将 JSON 对象加密而成的 Web Token。它包含了一些元数据,如它的签发人、被授权用户、过期时间等等。JWT 有三个部分,分别是 Header、Payload 和 Signature。Header 包含了 JWT 的类型和加密算法,Payload 是实际要传输的数据,Signature 是用于验证 JWT 的信息。
Header
Header 部分是一个 JSON 对象,包含两个属性:typ
和 alg
。typ
表示令牌的类型,通常为 JWT。alg
表示令牌使用的算法,例如 HS256 和 RS256。
{ "typ": "JWT", "alg": "HS256" }
Payload
Payload 部分也是一个 JSON 对象,包含要传输的数据。JWT 标准并没有规定哪些数据是必须的,但是有一些常用的字段:
iss
(Issuer):表示 JWT 的签发人。sub
(Subject):表示 JWT 的主题,通常为用户 ID。exp
(Expiration Time):表示 JWT 的过期时间。nbf
(Not Before):表示 JWT 的生效时间。iat
(Issued At):表示 JWT 的签发时间。jti
(JWT ID):表示 JWT 的唯一标识符。
例如,下面是一个包含了用户 ID、用户名、过期时间和签发时间的 Payload:
{ "userId": "123", "username": "john.doe", "exp": 1623966420, "iat": 1623962820 }
Payload 中的数据可以被加密,但是如果是加密过的数据,则无法读取其中的内容。
Signature
Signature 部分是对 Header 和 Payload 的加密字符串。加密的方法可以是 HMAC、RSA 或者其他加密算法,以确保令牌在传输期间不被篡改。
如何在 Deno 应用中使用 JSON Web Token?
有了对 JWT 的了解,我们接着来看看如何在 Deno 应用中使用它。
生成 JWT
首先,我们需要安装一个 JWT 库。在 Deno 中,我们可以使用 jwt
库,使用命令行安装:
deno install --allow-net --allow-read --name=jwt https://deno.land/x/djwt/cli.ts
生成 JWT 非常简单,只需要使用 jwt
命令并传递相应的参数即可:
jwt encode --secret=my-secret-key --payload='{"userId": "123", "username": "john.doe"}'
这个命令将会生成一个包含了 Header、Payload 和 Signature 的 JWT,并将其输出到控制台。
验证 JWT
在应用程序中,我们需要验证 JWT,以确保其有效性和完整性。我们可以使用 jwt
库中的 validateJwt
函数来验证 JWT。
首先,我们需要定义一个密钥,用于签名和验证令牌:
const key = "my-secret-key";
然后,我们可以定义一个中间件,在请求时验证 JWT。如果 JWT 有效,则请求将被继续处理,否则将返回 401 Unauthorized
:
-- -------------------- ---- ------- ------ - -- --- ---- ---------------------------------- ----- -------- ------------------- ---- ----- ----- ------------- - ----- ----- - --------------------------------------------------------- -- ---- -- -------- - ------------------- - ---- ------- - --- - ----- ---------------------- ---- - ----------- ---- --- ----- ------- - ----- ----- - ------------------- - ---- - -
在这个中间件中,我们首先获取请求中的 JWT。然后,我们在 try
块中使用 validateJwt
函数来验证 JWT。如果 JWT 有效,则请求将被继续处理,否则将返回 401 Unauthorized
。
解析 JWT
在某些情况下,我们需要解析 JWT 中的数据。我们可以使用 jwt
库中的 decode
函数来获取 JWT 中的 Payload 数据:
const token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiIxMjMifQ.PuMZJUiBRuC540fI0eCp5SVJCBG95RGofoyJkEQ5o5Q"; const payload = jwt.decode(token); console.log(payload); // { userId: "123" }
使用 JWT 进行授权
除了使用 JWT 进行认证外,我们还可以使用它进行授权。我们可以在 JWT 的 Payload 中添加用户拥有的权限,然后在路由中验证这些权限,以确保用户有权访问该路由:
-- -------------------- ---- ------- ------ - ------- ------ - ---- --------------------------------- ------ - -- --- ---- ---------------------------------- ----- ------ - --- --------- -------------------- ----- ----- ---- -- - ----- ----- - --------------------------------------------------------- -- ---- ----- ------- - ---------------- -- ---- -- --------- -- --------------------------------------- - ------------------- - ----------------- ------- - ----------------- - --------- -------- --- ------ ------- -------
在这个例子中,我们定义了一个路由,只有拥有 "admin" 权限的用户才能访问。我们首先获取请求中的 JWT,然后解析其中的 Payload 数据。如果用户没有 "admin" 权限,则返回 403 Forbidden
。
总结
本文介绍了 JSON Web Token 的基本原理,并探讨了如何在 Deno 应用中使用 JWT 进行用户认证和授权。我们使用了 jwt
库中的函数来生成、验证和解析 JWT,以及定义了一个中间件和路由,用于验证认证和授权。希望本文对你了解如何在 Deno 应用中使用 JWT 有帮助。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64c26f8983d39b488166f103