如何在Deno中创建和验证JSON令牌?
我是Deno运行时的新手,所以在Deno中使用JWT会很有帮助。
发布于 2020-10-23 08:35:30
下面是一个简短的演示,演示如何创建带有HS256签名的JWT,以及如何验证它并提取有效负载。
jwtdemo.ts (基于djwt 2.4版):
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。函数create和verify需要将key-parameter作为CryptoKey对象提供,因此即使对于HS256,也不能再传递简单的字符串,而是需要创建正确的键对象,如上面代码的第一行所示。
helper方法getNumericDate(exp)自动设置正确的Unix时间戳,并将作为参数给定的秒数添加到当前时间,或者直接使用给定的日期参数。
您可以直接运行上述演示程序,所有导入的模块都将自动下载:
deno run jwtdemo.ts结果是:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImZvbyI6ImJhciJ9.eyJpc3MiOiJkZW5vLWRlbW8iLCJleHAiOjE2MzMzNzUyODl9.FBYgDrpG9RXJSfgme-430UyFLvdNTNliYTKGiWajksQ
JWT is valid
{ iss: "deno-demo", exp: 1633375289 }或者,在出现错误签名的情况下(用错误的秘密取消代码块的注释以测试该代码块):
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImZvbyI6ImJhciJ9.eyJpc3MiOiJkZW5vLWRlbW8iLCJleHAiOjE2MzMzNzU0MDd9.F3szgyrTJSQG3m1a82OJkKqKIDD32Q21ZchAVAj74bk
The jwt's signature does not match the verification signature.在node.js中创建JWT的一个显著区别是,这里有预定义的接口Header和Payload,而不是简单的JSON,并且会检查值。
当我开始
const algorithm = "XS256" // instead of "HS256"对算法的检查将失败,程序不会启动:
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,该版本目前支持HSxxx、RSxxx、PSxxx和ESxxx (其中包含256、384、512中的xxx )签名算法。未来将增加更多的算法,这取决于deno密码模块中支持的可用性。
阅读这个答案,了解如何验证RS256签名令牌。
注意:这个答案已经重写,以涵盖版本2.4中djwt api的急剧变化。这篇文章的旧版本基于djwt v1.9
https://stackoverflow.com/questions/64494966
复制相似问题