首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于Deno的JWT认证

基于Deno的JWT认证
EN

Stack Overflow用户
提问于 2020-10-23 06:30:25
回答 1查看 1.4K关注 0票数 8

如何在Deno中创建和验证JSON令牌?

我是Deno运行时的新手,所以在Deno中使用JWT会很有帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-23 08:35:30

下面是一个简短的演示,演示如何创建带有HS256签名的JWT,以及如何验证它并提取有效负载。

jwtdemo.ts (基于djwt 2.4版):

代码语言:javascript
复制
import { create, verify , getNumericDate, Payload, Header} from "https://deno.land/x/djwt@v2.4/mod.ts";

const encoder = new TextEncoder()
var keyBuf = encoder.encode("mySuperSecret");

var key = await crypto.subtle.importKey(
  "raw",
  keyBuf,
  {name: "HMAC", hash: "SHA-256"},
  true,
  ["sign", "verify"],
)

const payload: Payload = {
  iss: "deno-demo",
  exp: getNumericDate(300), // expires in 5 min.
};

const algorithm = "HS256"

const header: Header = {
  alg: algorithm,
  typ: "JWT",
  foo: "bar"  // custom header
};

const jwt = await create(header, payload, key)

console.log(jwt);

// create a different key to test the verifcation
/*keyBuf = encoder.encode("TheWrongSecret");
key = await crypto.subtle.importKey(
  "raw",
  keyBuf,
  {name: "HMAC", hash: "SHA-256"},
  true,
  ["sign", "verify"],
)
*/

try {
  const payload = await verify(jwt, key); 
    console.log("JWT is valid");
    console.log(payload);
}
catch(_e){
  const e:Error= _e;
  console.log(e.message);
}

当前版本的djwt现在使用了自德诺·1.11以来可用的Web。函数createverify需要将key-parameter作为CryptoKey对象提供,因此即使对于HS256,也不能再传递简单的字符串,而是需要创建正确的键对象,如上面代码的第一行所示。

helper方法getNumericDate(exp)自动设置正确的Unix时间戳,并将作为参数给定的秒数添加到当前时间,或者直接使用给定的日期参数。

您可以直接运行上述演示程序,所有导入的模块都将自动下载:

代码语言:javascript
复制
deno run jwtdemo.ts

结果是:

代码语言:javascript
复制
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImZvbyI6ImJhciJ9.eyJpc3MiOiJkZW5vLWRlbW8iLCJleHAiOjE2MzMzNzUyODl9.FBYgDrpG9RXJSfgme-430UyFLvdNTNliYTKGiWajksQ
JWT is valid
{ iss: "deno-demo", exp: 1633375289 }

或者,在出现错误签名的情况下(用错误的秘密取消代码块的注释以测试该代码块):

代码语言:javascript
复制
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImZvbyI6ImJhciJ9.eyJpc3MiOiJkZW5vLWRlbW8iLCJleHAiOjE2MzMzNzU0MDd9.F3szgyrTJSQG3m1a82OJkKqKIDD32Q21ZchAVAj74bk
The jwt's signature does not match the verification signature.

在node.js中创建JWT的一个显著区别是,这里有预定义的接口HeaderPayload,而不是简单的JSON,并且会检查值。

当我开始

代码语言:javascript
复制
const algorithm = "XS256"   // instead of "HS256"

对算法的检查将失败,程序不会启动:

代码语言:javascript
复制
Check file:///C:/Users/jps/source/deno/jwtdemoV19.ts
error: TS2322 [ERROR]: Type '"XS256"' is not assignable to type 'Algorithm'.
  alg: algorithm,
  ~~~
    at file:///C:/Users/jps/source/deno/jwtdemoV19.ts:8:3

    The expected type comes from property 'alg' which is declared here on type 'Header'
      alg: Algorithm;
      ~~~
        at https://deno.land/x/djwt@v1.9/mod.ts:36:3

TS2345 [ERROR]: Argument of type '"XS256"' is not assignable to parameter of type 'AlgorithmInput'.
        const payload = await verify(jwt,  key, algorithm)
                                                ~~~~~~~~~
    at file:///C:/Users/jps/source/deno/jwtdemoV19.ts:26:42

Found 2 errors.

示例代码使用djwt版本2.4,该版本目前支持HSxxxRSxxxPSxxxESxxx (其中包含256、384、512中的xxx )签名算法。未来将增加更多的算法,这取决于deno密码模块中支持的可用性。

阅读这个答案,了解如何验证RS256签名令牌。

注意:这个答案已经重写,以涵盖版本2.4中djwt api的急剧变化。这篇文章的旧版本基于djwt v1.9

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64494966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档