노드에서 jwt의 사용을 네 가지 측면에서 살펴보겠습니다.

青灯夜游
풀어 주다: 2022-01-10 19:19:59
앞으로
2109명이 탐색했습니다.

nodejs에서 jwt를 어떻게 사용하나요? 다음 글에서는 JWT의 활용을 4가지 측면에서 소개하겠습니다. 여러분에게 도움이 되길 바랍니다!

노드에서 jwt의 사용을 네 가지 측면에서 살펴보겠습니다.

소개: http는 Stateless이므로 요청 응답 과정에서 사용자 신원 정보가 저장 및 기록되지 않으므로 쿠키, 세션, 쿠키 등 사용자 식별 및 사용자 신원 저장 방법이 다양합니다. jwt. 최근 제가 만든 인터페이스 서비스는 jwt를 사용하여 사용자 정보를 저장하고 관리하는 것입니다. 로컬 쿠키 저장 및 서버측 세션 저장에 비해 jwt는 더 안전하고 경제적이며 편리해졌습니다. 이 글에서는 node 서비스에서 jwt를 사용하는 방법을 설명합니다. . 간략하게 요약하세요.

목차

  • jwt 소개
  • 설치 및 구성
  • 패키징 방법
  • 실습

이 글에서는 위의 4가지 측면에서 jwt의 사용법을 소개합니다.

jwt 소개

Concept

JWT전체 이름 JSON 웹 토큰은 당사자 간 JSON으로 통신하는 간결하고 독립적인 방법을 정의하는 개방형 표준 RFC 7519입니다. 개체는 정보를 안전하게 전송합니다. JWT는 비밀 키나 RSA 또는 ECDSA를 사용하는 공개/개인 키 쌍을 사용하여 서명할 수 있으며 서명을 확인할 수 있습니다.

Components

jwt 서명 토큰은 일반적으로 헤더(헤더 정보), 페이로드(로드), 서명(서명)의 세 부분으로 구성됩니다(예: xxxxx.yyyyy.zzzzz ). 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包,你可以选择你认为合适的。

搜索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                |
로그인 후 복사

安装jwt

我个人觉得这个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,
    }
    로그인 후 복사
  • Signature
  • 서명 알고리즘을 사용하여 헤더 및 페이로드에 서명
예:
    function create (data, time) {
      let token = jwt.sign(data, config.secret, {
        algorithm: "HS256",
        expiresIn: time || config.time,
      })
      return token;
    }
    로그인 후 복사
  • 그러면 표준 jwt 서명 토큰은 다음과 같습니다. eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 .eyJz dWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c </ 코드>. </li><h3 data-id="heading-4"></ul>애플리케이션 시나리오<p></p><h2 data-id="heading-11"><strong>사용자 승인 액세스</strong></h2><p>예를 들어, 사용자가 로그인한 후 서버는 클라이언트에 jwt 토큰을 발급하며, 사용자가 로그인할 때마다 요청 헤더는 이 토큰을 전달하며 서버 측에서 이를 확인한 후 데이터를 얻을 수 있습니다. 이 방법은 오버헤드가 거의 없고 서버 측에 저장소가 필요하지 않으며 도메인 전체에서 사용할 수 있습니다. </p>🎜🎜정보 교환🎜🎜🎜 당사자 간 암호화된 정보를 저장하고 서명 내용의 변조 여부를 확인합니다. 🎜<h3 data-id="heading-5">🎜Security🎜🎜🎜토큰을 분해할 수 있으므로 내부의 헤더와 페이로드를 파싱하여 볼 수 있으므로 페이로드에 일부 개인 정보를 저장하지 않도록 하세요. 🎜<h2 data-id="heading-6">설치 및 구성🎜🎜 노드에서 jwt를 사용하여 작업을 수행해 보겠습니다. 🎜🎜npm 웹사이트에는 많은 jwt 패키지가 있으므로 자신에게 적합하다고 생각하는 패키지를 선택할 수 있습니다. 🎜<h3 data-id="heading-7">🎜jwt 검색🎜🎜<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:js;toolbar:false;">function verify (token) { return jwt.verify(token, config.secret, function (err, decoded) { if (err) { return { code: 1, msg: &amp;#39;invalid&amp;#39;, data: null, } } else { return { code: 2, msg: &amp;#39;valid&amp;#39;, data: decoded, } } }) }</pre><div class="contentsignin">로그인 후 복사</div></div><h3 data-id="heading-8">🎜jwt 설치🎜🎜🎜개인적으로는 <a href="https:// link.juejin.cn?target=https%3A%2F%2Fwww.npmjs.com%2Fpackage%2Fjsonwebtoken" target="_blank" rel="nofollow noopener noreferrer" title="https://www.npmjs.com/package /jsonwebtoken" ref="nofollow noopener noreferrer">jsonwebtoken🎜은 매우 좋습니다. 이 문서에서는 이 패키지를 사용합니다. 🎜<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:js;toolbar:false;">function decoded (token, complete = true) { return jwt.decode(token, { complete, }); }</pre><div class="contentsignin">로그인 후 복사</div></div><h3 data-id="heading-9">🎜일반적인 사용법🎜🎜🎜🎜Signature🎜🎜🎜🎜서명 구문🎜: <code>jwt.sign(payload, secretOrPrivateKey, [options, callback])</code >. 🎜🎜예: 🎜<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:js;toolbar:false;">mkdir test cd test npm init -y npm i jsonwebtoken</pre><div class="contentsignin">로그인 후 복사</div></div><div class="contentsignin">로그인 후 복사</div></div>🎜🎜Verification🎜🎜🎜🎜확인 구문🎜: <code>jwt.verify(token, secretOrPublicKey, [options, callback])🎜🎜예: 🎜
    // jwt.js
    const jwt = require(&#39;jsonwebtoken&#39;);
    const config = {
        secret: &#39;2021123456&#39;, // 密钥
        time: 60*60, // 过期时间
    }
    
    // 创建签名令牌
    function create (data, time) {
        let token = jwt.sign(data, config.secret, {
            algorithm: &#39;HS256&#39;,
            expiresIn: time || config.time,
        });
        return token;
    }
    
    // 验证令牌
    function verify (token) {
        return jwt.verify(token, config.secret, function (err, decoded) {
          if (err) {
            return {
              code: 1,
              msg: &#39;invalid&#39;,
              data: null,
            }
          } else {
            return {
              code: 2,
              msg: &#39;valid&#39;,
              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(&#39;./jwt&#39;);
    
    // 生成令牌
    let token = jwt.create({&#39;id&#39;: 1, &#39;name&#39;: &#39;mark&#39;}, 60*60*2);
    console.log(token); 
    
    /*
    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
    eyJpZCI6MSwibmFtZSI6Im1hcmsiLCJpYXQiOjE2MzkxMDYyNzMsImV4cCI6MTYzOTExMzQ3M30.
    20O1r0NVMf-j-9RwNcgls9ja0n1rGqSKN51_cRcvpE8
    */
    
    // 验证令牌
    let verifyRes = jwt.verify(token);
    console.log(verifyRes); 
    
    /* 
    {
        code: 2,
        msg: &#39;valid&#39;,
        data: { id: 1, name: &#39;mark&#39;, iat: 1639106273, exp: 1639113473 }
    }
    */
    
    // 解码令牌
    let deRes = jwt.decoded(token, true);
    console.log(deRes);
    
    /*
    {
      header: { alg: &#39;HS256&#39;, typ: &#39;JWT&#39; },
      payload: { id: 1, name: &#39;mark&#39;, iat: 1639106273, exp: 1639113473 },
      signature: &#39;20O1r0NVMf-j-9RwNcgls9ja0n1rGqSKN51_cRcvpE8&#39;
    }
    */
    로그인 후 복사
    로그인 후 복사
    🎜🎜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方法
    // jwt.js
    const jwt = require(&#39;jsonwebtoken&#39;);
    const config = {
        secret: &#39;2021123456&#39;, // 密钥
        time: 60*60, // 过期时间
    }
    
    // 创建签名令牌
    function create (data, time) {
        let token = jwt.sign(data, config.secret, {
            algorithm: &#39;HS256&#39;,
            expiresIn: time || config.time,
        });
        return token;
    }
    
    // 验证令牌
    function verify (token) {
        return jwt.verify(token, config.secret, function (err, decoded) {
          if (err) {
            return {
              code: 1,
              msg: &#39;invalid&#39;,
              data: null,
            }
          } else {
            return {
              code: 2,
              msg: &#39;valid&#39;,
              data: decoded,
            }
          }
        })
    }
    
    // 解码令牌
    function decoded (token, complete = true) {
        return jwt.decode(token, {
          complete,
        });
    }
    
    const token = {
        create,
        verify,
        decoded,
    }
    
    module.exports = token;
    로그인 후 복사
    로그인 후 복사
    • 创建token,验证token,解码token
    // index.js
    const jwt = require(&#39;./jwt&#39;);
    
    // 生成令牌
    let token = jwt.create({&#39;id&#39;: 1, &#39;name&#39;: &#39;mark&#39;}, 60*60*2);
    console.log(token); 
    
    /*
    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
    eyJpZCI6MSwibmFtZSI6Im1hcmsiLCJpYXQiOjE2MzkxMDYyNzMsImV4cCI6MTYzOTExMzQ3M30.
    20O1r0NVMf-j-9RwNcgls9ja0n1rGqSKN51_cRcvpE8
    */
    
    // 验证令牌
    let verifyRes = jwt.verify(token);
    console.log(verifyRes); 
    
    /* 
    {
        code: 2,
        msg: &#39;valid&#39;,
        data: { id: 1, name: &#39;mark&#39;, iat: 1639106273, exp: 1639113473 }
    }
    */
    
    // 解码令牌
    let deRes = jwt.decoded(token, true);
    console.log(deRes);
    
    /*
    {
      header: { alg: &#39;HS256&#39;, typ: &#39;JWT&#39; },
      payload: { id: 1, name: &#39;mark&#39;, iat: 1639106273, exp: 1639113473 },
      signature: &#39;20O1r0NVMf-j-9RwNcgls9ja0n1rGqSKN51_cRcvpE8&#39;
    }
    */
    로그인 후 복사
    로그인 후 복사

    运行一下命令node index.js测试是否正确。

    好了,以上就是jwt在node中的一些应用和实践方法!

    更多node相关知识,请访问:nodejs 教程!!

    위 내용은 노드에서 jwt의 사용을 네 가지 측면에서 살펴보겠습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:juejin.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿