在Deno中使用JSON Web令牌

2020年12月30日11:22:20 发表评论 37 次浏览

本文概述

天野是使用V8且内置于Rust的JavaScript和TypeScript的简单, 现代且安全的运行时。与Node.js不同, Deno具有对TypeScript的内置支持, 默认情况下是安全的。 Deno使用具有浏览器兼容URL的第三方程序包来管理模块, 而不是将其导入并缓存在我们的本地计算机中。

JSON Web令牌(JWT)是用于创建具有可选签名和/或可选加密的数据的互联网标准, 其有效负载包含声明了一些声明的JSON。简而言之, 它基本上用于身份验证。当用户登录到应用程序时, 该应用程序将创建一个JWT并将其发送回用户。

在Deno中, JWT的大多数用例是开发人员实施身份验证系统, 以便用户必须登录才能访问特定数据。

在本文中, 我们将使用Deno's将JWT集成到我们的Deno应用程序中djwt集成软件包。

先决条件

  • 扎实的理解的JavaScript
  • 文本编辑器(在本例中, 我们将使用VS代码)
  • 邮差安装在本地计算机上

Deno中的JSON Web令牌入门

为了在我们的Deno应用程序中使用JWT, 我们必须使用djwtDeno库为此。注意djwt不处理任何形式的身份验证或授权-它的作用是生成和验证有效的JSON Web令牌。

首先, 让我们在主目录中为应用程序创建一个新目录。在此目录中, 我们将创建一个索引文件, 我们将在其中编写代码:

cd desktop && mkdir denojwt && cd denojwt
touch index.ts
code .

这将创建目录和索引文件。的代码。命令将以VS Code打开我们的应用程序。随意使用你选择的任何文本编辑器。

要使用djwt库, 我们必须将此方法导入到我们的应用程序中:

import { validateJwt } from "https://deno.land/x/djwt/validate.ts";
import { makeJwt, setExpiration, Jose, Payload } from "https://deno.land/x/djwt/create.ts";

在这里validateJwt方法将检查令牌是否有效。的makeJwt方法将生成有效的JWT, 并且setExpiration方法将设置令牌的到期时间。有效载荷是用于JWT有效负载或数据的TypeScript接口。约瑟指示令牌的算法和类型。

要定义路由并设置服务器, 我们将使用橡木图书馆。让我们设置一个简单的服务器并使用橡木:

我们为制作了一个自定义演示.
不完全是。点击这里查看.

在Deno中使用JSON Web令牌1
import { Application, Router } from "https://deno.land/x/oak/mod.ts";
const app = new Application();
const PORT:number = 8080
//create a new instance of router
const router = new Router();
router
  .get("/test", (context) => {
    context.response.body = "Hello world!";
  })
  .get("/user", (context) => {
    context.response.body = "My name is Wisdom Ekpot";
  })
  app.use(router.routes());
app.use(router.allowedMethods());
await app.listen({ port: PORT });

生成JSON Web令牌

使用JWT时, 我们必须设置一个秘密密钥, 一个有效负载和一个标头。这是基本的JWT配置。最好将这些配置存储在变量中:

const key = "mynameisxyzekpot";

const header: Jose = {
    alg: "HS256", typ: "JWT", }

let payloader = (name:string) => {
  let payload:Payload = {
    iss: name, exp: setExpiration(new Date("2021-01-01"))
  }
  return payload
}

的有效载荷方法将获得有效负载作为参数, 并将到期数据持续时间设置为2021-01-01。我们将必须返回有效载荷对象, 以便可以在makeJwt方法。

有了这个定义, 我们现在可以编写一个简单的方法, 该方法将使用定义的配置返回有效的令牌。要生成令牌, 我们将使用makeJwt这种方式的方法:

const generateJWT = (name:string) => {
  return makeJwt({ key:secret_key, header, payload:payloader(name) })
}

在这里, 我们将传递用户输入的名称作为参数, 然后使用有效载荷充当有效载荷。

现在, 我们可以设置一个简单的路由, 该路由将调用此方法并发送有效令牌作为响应。

因为我们将Oak用于服务器和路由, 所以我们可以创建一个简单的发布路由, 该路由将用于为我们生成有效的令牌:

.post("/generate", async (context) => {
     let body: any = await context.request.body();
    const { name } = await body.value;
    let token = await generateJWT(name)
    context.response.body = { status: true, data: name, token:token };
  });

接下来, 我们将添加一个新/生成发布请求路线, 该路线将使用生成JWT根据输入的名称为用户生成令牌的方法。

context.request.body()获取请求的正文, 我们可以从中获取用户输入的名称。现在, 让我们使用POSTMAN测试端点。

在Deno中使用JSON Web令牌2

发送发帖请求到/生成路由并传递名称作为正文将为该用户生成令牌。

验证JSON Web令牌

我们可以用进口的validateJwt检查令牌是否有效。此方法采用代币, 键和算法作为参数。我们将使用从makeJwt测试方法。

首先, 创建一种验证方法:

const validateToken = (token:string) => {
    return validateJwt({jwt:token, key:secret_key, algorithm:header.alg});
}

请注意, 我们使用了在标头对象中定义的算法, 并且使用了相同的算法密钥.

现在, 我们可以为验证创建新的发布路线:

.post("/validate", async (context) => {
    let body: any = await context.request.body();
    const { token } = await body.value;
    let validator =  await validateToken(token)
   context.response.body = {validator};
  });

接下来, 让我们使用验证器方法检查令牌是否有效。如果令牌有效, 它将返回与创建时相同的有效负载。但是, 如果令牌无效, 我们将获得以下响应:

"validator": {
        "jwt": "yJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJXaXNkb20gRWtwb3QiLCJleHAiOjE2MDk0NTkyMDB9.-uucC6ORuOGNWAkj2d7CTRYzBJTnIn7rcaZXslrSxlg", "error": {
            "name": "JwtError", "date": "2020-10-23T19:40:29.472Z"
        }, "isValid": false, "isExpired": false
    }

这是无效令牌的示例响应:

JWT面额无效令牌

在这里已验证参数返回为false, 并且返回错误对象。

有效的JWT如下所示:

JSON Web令牌面额有效

总结

在Deno应用程序中添加任何形式的身份验证对于应用程序安全至关重要。 JWT在各种技术中得到了广泛的使用, 这使其成为在我们的应用程序中实现授权和认证时考虑的绝佳选择。

有关该项目的源代码, 请查看我的GitHub回购.

日志火箭:全面了解你的网络应用

LogRocket仪表板免费试用横幅

日志火箭是一个前端应用程序监视解决方案, 可让你重播问题, 就好像问题发生在你自己的浏览器中一样。 notlogy无需猜测错误发生的原因, 也不要求用户提供屏幕截图和日志转储, 而是让你重播会话以快速了解出了什么问题。无论框架如何, 它都能与任何应用完美配合, 并具有用于记录来自Redux, Vuex和@ ngrx / store的其他上下文的插件。

除了记录Redux动作和状态外, notlogy还会记录控制台日志, JavaScript错误, 堆栈跟踪, 带有标题+正文, 浏览器元数据和自定义日志的网络请求/响应。它还使用DOM来记录页面上的HTML和CSS, 甚至可以为最复杂的单页面应用程序重新创建像素完美的视频。

免费试用

.

一盏木

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: