nodejsでのexpressに基づくJWT認証メカニズムの使用、jsonwebtokenパッケージとexpress-jwtミドルウェアの使用、およびトークンインターセプトのミドルウェア

1.JWTのコンポーネント

JWT通常由三部分组成,分别是 Header(头部)、Payload(有效荷载)、Signature(签名)。
    三者之间使用英文的“.”分隔,格式如下:
        Header.Payload.Signature

2.JWTの3つの部分の意味

    JWT的三个组成部分,从前到后分别是 Header、Payload、Signature。
        其中:
            Payload部分才是真正的用户信息,它是用户信息经过加密之后生成的字符串。
            Header和Signature是安全性相关的部分,只是为了保证Token的安全性。

3.JWTの使用方法

    客户端收到服务器返回的JWT之后,通常会将它储存在localStorage或sessionStorage 中。
    此后,客户端每次与服务器通信,都要带上这个WT的字符串,从而进行身份认证。推荐的做法是把JWT放在HTTP请求头的Authorization字段中,格式如下:
        Authorization: Bearer <token>

注意点:トークン文字列を生成するときは、セキュリティ上のリスクがあるパスワードとアバターを必ず削除してください
。1.次のコマンドを実行して、トークン文字列を生成するパッケージをインストールします。

npm i jsonwebtoken@8.5.1

2.トークンjsファイルを送信するモジュールのヘッダー領域で、jsonwebtokenパッケージをインポートします。

const jwt = require('jsonwebtoken')

3. config.jsファイルを作成し、暗号化および復元されたトークンのjwtSecretKey文字列を共有します
。2020年7月7日のjwt更新後、インストールされたexpress-jwtモジュールはデフォルトでバージョン6.0.0になり、更新されたjwtは構成でアルゴリズム属性を追加します。つまり、jwtのアルゴリズムを設定します。通常、HS256はアルゴリズムを構成するためのデフォルト値です。

//我这里版本比较低不用配置algorithms
module.exports = {
    
    
  jwtSecretKey: 'itheima No1. ^_^',
}

4.ユーザー情報オブジェクトをトークン文字列に暗号化します

// 导入配置文件
const config = require('../config')

// 生成 Token 字符串
const tokenStr = jwt.sign(user, config.jwtSecretKey, {
    
    
  expiresIn: '10h', // token 有效期为 10 个小时
})

5.生成されたトークン文字列をクライアントに応答します

res.send({
    
    
  status: 0,
  message: '登录成功!',
  // 为了方便客户端使用 Token,在服务器端直接拼接上 Bearer 的前缀
  token: 'Bearer ' + tokenStr,
})
  1. トークンを解析するためのミドルウェアを構成する

1.次のコマンドを実行して、トークンを解析するためのミドルウェアをインストールします。

npm i express-jwt@5.3.3

2. app.jsにルートを登録する前に、トークンを解析するミドルウェアを構成します。

// 导入配置文件
const config = require('./config')

// 解析 token 的中间件
const expressJWT = require('express-jwt')

// 使用 .unless({ path: [/^\/api\//] }) 指定哪些接口不需要进行 Token 的身份认证
app.use(expressJWT({
    
     secret: config.jwtSecretKey }).unless({
    
     path: [/^\/api\//] }))

3. app.jsのエラーレベルミドルウェアで、トークン認証が失敗した後にエラーをキャプチャして処理します

// 错误中间件
app.use(function (err, req, res, next) {
    
    
  // 省略其它代码...

  // 捕获身份认证失败的错误
  if (err.name === 'UnauthorizedError') return res.cc('身份认证失败!')

  // 未知错误...
})

このようにして、トークンとトークン検証のインターセプトを正常に設定できました。
リクエストで認証が成功した場合、req.userを使用して、トークンにカプセル化されたユーザーの情報を取得できます*

おすすめ

転載: blog.csdn.net/weixin_45822938/article/details/123256503