nodejs中要怎么使用jwt?下面本篇文章就来给大家从四个方面介绍一下jwt的使用,希望对大家有所帮助!
导语:由于http是无状态的,请求响应过程中不存储记录用户身份信息,所以就出现了很多用户识别存储用户身份的方法,比如cookie,session,jwt。我最近做的一个接口服务使用了jwt来存储管理用户信息,相较于本地cookie存储,服务器端session存储,jwt就变得比较安全和节省方便,本文就jwt在node服务中的使用方法做一个简单的总结。
目录jwt简介安装配置封装方法实战练习本文从以上四个方面介绍jwt的使用。
jwt简介概念jwt全称json web token,它是一种开放标准rfc 7519,定义了一种紧凑且自包含的方式,用于在各方之间作为json对象安全地传输信息。jwt可以使用密钥或使用rsa或ecdsa的公钥/私钥对进行签名,可以对签名进行验证。
组成部分jwt签名令牌一般由三部分组成,分别是header(头部信息),payload(载荷),signature(签名),例如xxxxx.yyyyy.zzzzz。
header一般是存储令牌的类型和签名算法,比如:
{ "alg": "hs256", "typ": "jwt"}
payload一般是存储声明,也就是用户信息和附件数据,分为注册声明、公共声明和私人声明。
比如:
{ "sub": "1234567890", "name": "john doe", "admin": true}
签名利用签名算法对header和payload进行签名
比如:
hmacsha256( base64urlencode(header) + "." + base64urlencode(payload), secret)
那么一个标准的jwt签名令牌会是这样的eyjhbgcioijiuzi1niisinr5cci6ikpxvcj9.eyjzdwiioiixmjm0nty3odkwiiwibmftzsi6ikpvag4grg9liiwiawf0ijoxnte2mjm5mdiyfq.sflkxwrjsmekkf2qt4fwpmejf36pok6yjv_adqssw5c。
应用场景用户授权访问比如用户登录后,服务端下发一个jwt令牌给客户端,每次用户请求数据都在请求头里面携带此令牌,服务端验证通过后可以获取到数据,这种方式开销很小,并不需要服务端进行存储,而且还可以跨域使用。
信息交换在各方之间存储加密信息,验证签名内容是否篡改。
安全性由于令牌可以被拆解,里面的header和payload可以被解析看到,所以尽量不要在payload里面存储一些私密的信息。
安装配置下面就在node中使用jwt做一下操作。
在npm网站,有很多的jwt包,你可以选择你认为合适的。
搜索jwtname | description | author | date | version | keywordsjwt | json web token for… | =mattrobenolt | 2012-05-05 | 0.2.0 |express-jwt | jwt authentication… | =woloski… | 2021-08-11 | 6.1.0 | auth authn authentication authz authorization http jwt token oauth expressjsonwebtoken | json web token… | =dschenkelman… | 2019-03-18 | 8.5.1 | jwtjwt-decode | decode jwt tokens,… | =jeff.shuman… | 2020-11-16 | 3.1.2 | jwt browserpassport-jwt | passport… | =themikenichol… | 2018-03-13 | 4.0.0 | passport strategy json web token jwtkoa-jwt | koa middleware for… | =stiang… | 2021-09-24 | 4.0.3 | auth authn authentication authz authorization http jwt json middleware token oauth permissions koajsrsasign | opensource free… | =kjur | 2021-12-01 | 10.5.1 | crypto cryptography cipher rsa ecdsa dsa rsapss pkcs#1 pkcs#5 pkcs#8 private key public key csr pkcs#10 hash function hmac asn.1 certexpress-jwt-permissions | express middleware… | =angryunicorn… | 2021-08-18 | 1.3.6 | express middleware jwt permissions authorization token securitynjwt | jwt library for… | =robertjd | 2021-12-03 | 1.2.0 | jwtfastify-jwt | jwt utils for… | =starptech… | 2021-12-03 | 4.1.0 | jwt json token jsonwebtoken fastifydid-jwt | library for signing… | =simonas-notcat… | 2021-12-03 | 5.12.1 | hapi-auth-jwt2 | hapi.js… | =nelsonic | 2020-09-08 | 10.2.0 | hapi.js authentication auth json web tokens jwtauth0-lock | auth0 lock | =jeff.shuman… | 2021-11-02 | 11.31.1 | auth0 auth openid authentication passwordless browser jwtjwks-rsa | library to retrieve… | =jeff.shuman… | 2021-10-15 | 2.0.5 | jwks rsa jwtrestify-jwt-community | jwt authentication… | =frbuceta | 2021-12-05 | 1.1.21 | auth authentication authorization http jwt token oauth restifydid-jwt-vc | create and verify… | =simonas-notcat… | 2021-11-23 | 2.1.8 | jwt-service | a simple wrapper… | =nfroidure | 2021-11-01 | 8.0.0 | jwt knifecycleangular-jwt | library to help you… | =jeff.shuman… | 2019-03-20 | 0.1.11 |@thream/socketio-jwt | authenticate… | =divlo | 2021-07-23 | 2.1.1 | socket socket.io jwtappstore-connect-jwt-gene | [。
例如:
// 一般签名var jwt = require('jsonwebtoken');var token = jwt.sign({ foo: 'bar' }, 'secret');// 加私钥签名var privatekey = fs.readfilesync('private.key');var token = jwt.sign({ foo: 'bar' }, privatekey, { algorithm: 'rs256'});// 设置过期时间jwt.sign({ data: 'bar'}, 'secret', { expiresin: 60 * 60 }); // 1h
验证验证语法:jwt.verify(token, secretorpublickey, [options, callback])
例如:
// 一般验证var decoded = jwt.verify(token, 'secret');console.log(decoded.foo) // bar// 公钥验证var cert = fs.readfilesync('public.pem');jwt.verify(token, cert, function(err, decoded) { console.log(decoded.foo) // bar});
解码解码语法:jwt.decode(token [, options])
例如:
var decoded = jwt.decode(token, {complete: true});console.log(decoded.header);console.log(decoded.payload);
封装方法根据安装配置里面的方法,可以根据自己的需要进行二次封装,更加适合自己的方法。
引入依赖包和配置const jwt = require("jsonwebtoken");const config = { secret: '2021123456**', time: 60 * 60,}
签名function create (data, time) { let token = jwt.sign(data, config.secret, { algorithm: "hs256", expiresin: time || config.time, }) return token;}
验证function verify (token) { return jwt.verify(token, config.secret, function (err, decoded) { if (err) { return { code: 1, msg: 'invalid', data: null, } } else { return { code: 2, msg: 'valid', data: decoded, } } })}
解码function decoded (token, complete = true) { return jwt.decode(token, { complete, });}
上面是比较简单的方法,如果你还想使用公钥私钥,可以用上面安装配置里面介绍的那样。
实战练习经过上面的封装方法,可以来实战演练一下,是否有效。
新建一个文件夹test,新建一个文件index.js用于存放测试案例,jwt.js用于存储调用方法。mkdir testcd testnpm init -ynpm i jsonwebtoken
jwt方法// jwt.jsconst jwt = require('jsonwebtoken');const config = { secret: '2021123456', // 密钥 time: 60*60, // 过期时间}// 创建签名令牌function create (data, time) { let token = jwt.sign(data, config.secret, { algorithm: 'hs256', expiresin: time || config.time, }); return token;}// 验证令牌function verify (token) { return jwt.verify(token, config.secret, function (err, decoded) { if (err) { return { code: 1, msg: 'invalid', data: null, } } else { return { code: 2, msg: 'valid', data: decoded, } } })}// 解码令牌function decoded (token, complete = true) { return jwt.decode(token, { complete, });}const token = { create, verify, decoded,}module.exports = token;
创建token,验证token,解码token// index.jsconst jwt = require('./jwt');// 生成令牌let token = jwt.create({'id': 1, 'name': 'mark'}, 60*60*2);console.log(token); /*eyjhbgcioijiuzi1niisinr5cci6ikpxvcj9.eyjpzci6mswibmftzsi6im1hcmsilcjpyxqioje2mzkxmdyynzmsimv4cci6mtyzotexmzq3m30.20o1r0nvmf-j-9rwncgls9ja0n1rgqskn51_crcvpe8*/// 验证令牌let verifyres = jwt.verify(token);console.log(verifyres); /* { code: 2, msg: 'valid', data: { id: 1, name: 'mark', iat: 1639106273, exp: 1639113473 }}*/// 解码令牌let deres = jwt.decoded(token, true);console.log(deres);/*{ header: { alg: 'hs256', typ: 'jwt' }, payload: { id: 1, name: 'mark', iat: 1639106273, exp: 1639113473 }, signature: '20o1r0nvmf-j-9rwncgls9ja0n1rgqskn51_crcvpe8'}*/
运行一下命令node index.js测试是否正确。
好了,以上就是jwt在node中的一些应用和实践方法!
更多node相关知识,请访问:nodejs 教程!!
以上就是从四个方面来看看 jwt 在node中的使用的详细内容。
