nodejs에서 jwt를 어떻게 사용하나요? 다음 글에서는 JWT의 활용을 4가지 측면에서 소개하겠습니다. 여러분에게 도움이 되길 바랍니다!
소개: http는 Stateless이므로 요청 응답 과정에서 사용자 신원 정보가 저장 및 기록되지 않으므로 쿠키, 세션, 쿠키 등 사용자 식별 및 사용자 신원 저장 방법이 다양합니다. jwt. 최근 제가 만든 인터페이스 서비스는 jwt를 사용하여 사용자 정보를 저장하고 관리하는 것입니다. 로컬 쿠키 저장 및 서버측 세션 저장에 비해 jwt는 더 안전하고 경제적이며 편리해졌습니다. 이 글에서는 node 서비스에서 jwt를 사용하는 방법을 설명합니다. . 간략하게 요약하세요.
이 글에서는 위의 4가지 측면에서 jwt의 사용법을 소개합니다.
JWT전체 이름 JSON 웹 토큰은 당사자 간 JSON으로 통신하는 간결하고 독립적인 방법을 정의하는 개방형 표준 RFC 7519입니다. 개체는 정보를 안전하게 전송합니다. JWT는 비밀 키나 RSA 또는 ECDSA를 사용하는 공개/개인 키 쌍을 사용하여 서명할 수 있으며 서명을 확인할 수 있습니다.
jwt 서명 토큰은 일반적으로 헤더(헤더 정보), 페이로드(로드), 서명(서명)의 세 부분으로 구성됩니다(예: xxxxx.yyyyy.zzzzz
). xxxxx.yyyyy.zzzzz
。
一般是存储令牌的类型和签名算法,比如:
{ "alg": "HS256", "typ": "JWT" }
一般是存储声明,也就是用户信息和附件数据,分为注册声明、公共声明和私人声明。
比如:
{ "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包,你可以选择你认为合适的。
NAME | DESCRIPTION | AUTHOR | DATE | VERSION | KEYWORDS jwt | 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 express jsonwebtoken | JSON Web Token… | =dschenkelman… | 2019-03-18 | 8.5.1 | jwt jwt-decode | Decode JWT tokens,… | =jeff.shuman… | 2020-11-16 | 3.1.2 | jwt browser passport-jwt | Passport… | =themikenichol… | 2018-03-13 | 4.0.0 | Passport Strategy JSON Web Token JWT koa-jwt | Koa middleware for… | =stiang… | 2021-09-24 | 4.0.3 | auth authn authentication authz authorization http jwt json middleware token oauth permissions koa jsrsasign | 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 security njwt | JWT Library for… | =robertjd | 2021-12-03 | 1.2.0 | jwt fastify-jwt | JWT utils for… | =starptech… | 2021-12-03 | 4.1.0 | jwt json token jsonwebtoken fastify did-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 JWT auth0-lock | Auth0 Lock | =jeff.shuman… | 2021-11-02 | 11.31.1 | auth0 auth openid authentication passwordless browser jwt jwks-rsa | Library to retrieve… | =jeff.shuman… | 2021-10-15 | 2.0.5 | jwks rsa jwt restify-jwt-community | JWT authentication… | =frbuceta | 2021-12-05 | 1.1.21 | auth authentication authorization http jwt token oauth restify did-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 knifecycle angular-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 jwt appstore-connect-jwt-gene | [![NPM](https://nod… | =poad | 2021-10-15 | 1.0.1 | jwt appstore rator-core |
我个人觉得这个jsonwebtoken很不错,本文就使用这个包。
npm i jsonwebtoken
签名语法:jwt.sign(payload, secretOrPrivateKey, [options, callback])
。
例如:
// 一般签名 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])
header
var decoded = jwt.decode(token, {complete: true}); console.log(decoded.header); console.log(decoded.payload);
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; }
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 .eyJz dWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c 코드>.
예를 들어, 사용자가 로그인한 후 서버는 클라이언트에 jwt 토큰을 발급하며, 사용자가 로그인할 때마다 요청 헤더는 이 토큰을 전달하며 서버 측에서 이를 확인한 후 데이터를 얻을 수 있습니다. 이 방법은 오버헤드가 거의 없고 서버 측에 저장소가 필요하지 않으며 도메인 전체에서 사용할 수 있습니다.
🎜🎜정보 교환🎜🎜🎜 당사자 간 암호화된 정보를 저장하고 서명 내용의 변조 여부를 확인합니다. 🎜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, }); }
jwt.sign(payload, secretOrPrivateKey, [options, callback])
. 🎜🎜예: 🎜mkdir test cd test npm init -y npm i jsonwebtoken🎜🎜Verification🎜🎜🎜🎜확인 구문🎜:
jwt.verify(token, secretOrPublicKey, [options, callback])
🎜🎜예: 🎜// jwt.js 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, }); } const token = { create, verify, decoded, } module.exports = token;🎜🎜Decode🎜 🎜🎜 🎜디코딩 구문🎜:
jwt.decode(token [, options])
🎜🎜예: 🎜// index.js const 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' } */🎜🎜Encapsulation method🎜🎜🎜설치 구성의 방법에 따라 다음을 수행할 수 있습니다. 당신에게 더 적합한 방법인 캡슐화를 필요에 따라 두 번 수행합니다. 🎜🎜🎜종속성 패키지 및 구성 소개🎜🎜rrreee🎜🎜Signature🎜🎜rrreee🎜🎜Verification🎜🎜rrreee🎜🎜Decoding🎜🎜rrreee🎜위의 방법은 비교적 간단한 방법입니다. , 위의 설치 구성에 설명된 대로 사용할 수 있습니다. 🎜🎜🎜실습🎜🎜🎜위의 포장 방법을 설명한 후, 실제로 실천해 보면 효과가 있는지 확인할 수 있습니다. 🎜
test
,新建一个文件index.js
用于存放测试案例,jwt.js
用于存储调用方法。mkdir test cd test npm init -y npm i jsonwebtoken
// jwt.js 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, }); } const token = { create, verify, decoded, } module.exports = token;
// index.js const 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의 사용을 네 가지 측면에서 살펴보겠습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!