在前端开发中,授权是一个重要的话题。JSON Web Tokens(JWT)是一种常见的授权方式,它可以帮助我们对用户进行身份验证和授权。在 Deno 中使用 JWT 可以很容易地实现授权和认证。
什么是 JSON Web Tokens
JSON Web Tokens(JWT)是一种开放的标准(RFC 7519),它定义了一种简单的方式,用于在各个服务之间进行安全地传输信息。它主要由三部分组成:头部、负载和签名。
头部包含指示 JWT 签名算法的信息,例如 HS256 或 RS512。负载是包含 JWT 数据的地方。它可以包含一些特定的声明,例如 iss(发行者)、exp(过期时间)、sub(主题)等等。最后,签名是将头部和负载组合起来并使用所选算法生成的哈希值。
JWT 通常用于身份验证和授权。当用户成功登录后,服务器会生成一个 JWT,并将其发送回客户机。客户机在后续的请求中使用 JWT 来证明自己的身份。服务器可以通过解码和验证 JWT 来确定客户端是否已经授权。
在 Deno 中使用 JSON Web Tokens
在 Deno 中使用 JWT 前,需要先安装一个 JWT 模块,这里我们选择使用一个叫做 Oak 的框架来实现。
// javascriptcn.com 代码示例 import { Application, Router } from 'https://deno.land/x/oak/mod.ts'; import { parse } from 'https://deno.land/std/flags/mod.ts'; import * as jwt from 'https://deno.land/x/djwt/create.ts'; import { validateJwt } from 'https://deno.land/x/djwt/validate.ts'; const {args} = Deno; const DEFAULT_PORT = 8000; const argPort = parse(args).port; const port = argPort ? parseInt(argPort) : DEFAULT_PORT; const app = new Application(); const router = new Router(); const users = new Map(); users.set('john', {password: 'password'}); router .post('/login', async (ctx) => { const {value} = await ctx.request.body(); const {username, password} = value; if (!users.has(username) || users.get(username).password !== password) { ctx.response.status = 401; } else { const payload = {username}; const jwtToken = await jwt.create({alg: "HS256", typ: "JWT"}, payload, "secret"); ctx.response.body = {jwtToken}; } }) .get('/me', async (ctx) => { const jwtToken = ctx.request.headers.get("Authorization")?.split(" ")[1]; const data = await validateJwt(jwtToken, "secret"); if (data) { ctx.response.body = data; } else { ctx.response.status = 401; } }); app.use(router.routes()); app.use(router.allowedMethods()); console.log(`server started on localhost:${port}`); await app.listen({ port });
以上代码中,我们创建了一个基本的 Oak 应用程序,并添加了两个路由。第一个路由是 /login 路由,用于创建一个 JWT 并将其发送回客户机。第二个路由是 /me 路由,用于验证客户机所发送的 JWT 并返回用户的信息。
总结
JWT 是一个简单、安全的身份验证和授权标准,它可以被广泛地应用在各种场景下。在 Deno 中使用 JWT 是非常容易的,我们只需要安装一个 JWT 模块并集成到我们的应用程序中即可。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/654f6d0a7d4982a6eb8619c4