最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

node.js配置Token驗證的2種方式總結(jié)

 更新時間:2023年02月03日 10:20:35   作者:抗爭的小青年  
token驗證,在設計登錄注冊和一些權(quán)限接口時發(fā)揮作用,下面這篇文章主要給大家介紹了關(guān)于node.js配置Token驗證的2種方式,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下

1. 生成Token jwt passport實現(xiàn)生成和驗證Token

jsonwebtoken

1.安裝

npm i jsonwebtoken

2.引入

const jwt = require('jsonwebtoken')s

3.定義規(guī)則

const rule = {<!--{C}%3C!%2D%2D%20%2D%2D%3E--> id: result[0].id, name: result[0].name }

由于id,和name都是通過數(shù)據(jù)庫獲取過來的,所以用的這種方式

4.設置jwt.sign方法/生成token

jwt.sign("規(guī)則", "加密名字", "過期時間", "箭頭函數(shù)")
        jwt.sign(rule, key.secretOrkey, { expiresIn: 3600 }, (err, token) => {
          if (err) return err.message
          return res.send({
            code: 1,
            msg: `Bearer ${token}`
          })
        })

這里的rule就是上面所說的校驗規(guī)則,key.secretOrkey就是加密名字,只不過封裝到了外部,expiresIn:3600,就說明是3600秒,msg返回的就是生成的Token

5.驗證token

// $router get api/user/current
// @desc return current user
// @access private
router.get("/current", "驗證Token", (req, res) => {
  res.send({
    code: 1,
    msg: '驗證成功'
  })
})

我們需要在"驗證Token"那里對Token進行驗證

2. 使用passpport-jwt||passport驗證Token

passport

passport-jwt

1.安裝

npm install passport-jwt
npm i passport

2.使用

這是從npm摘抄過來的的示例方法

passport

passport.use(new LocalStrategy(
  function(username, password, done) {
    User.findOne({ username: username }, function (err, user) {
      if (err) { return done(err); }
      if (!user) { return done(null, false); }
      if (!user.verifyPassword(password)) { return done(null, false); }
      return done(null, user);
    });
  }
));

這個方法中的User.findOne方法可以刪除,寫上自己的業(yè)務邏輯,我用的是mysql,所以沒有用User.findeOne方法

初始化passport

app.use(passport.initialize());

passport-jwt

new JwtStrategy(options, verify)

3.實際使用

index.js(項目入口文件)

const passport = require("passport")

//在入口文件中配置和引用
//初始化passport
app.use(passport.initialize());
require("./config/passport")(passport)

這里單獨抽離了passport配置文件,同時將上面引入的passprot進行引入

config/passport.js

const db = require("../db/index")
const JwtStrategy = require('passport-jwt').Strategy
const ExtractJwt = require('passport-jwt').ExtractJwt

const key = require("../config/key")
const opts = {}
opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken();
opts.secretOrKey = key.secretOrkey;


module.exports = passport => {
  passport.use(new JwtStrategy(opts, (jwt_payload, done) => {
    // { id: 1, name: 'wz', iat: 1660299838, exp: 1660303438 }
    console.log(jwt_payload);
    sqlcc = `SELECT * FROM user WHERE id=${jwt_payload.id};`
    db.query(sqlcc, (err, result) => {
      console.log(result[0]);
      if (err) {
        return done(null, err.message)
      }
      if (result.length != 0) {
        return done(null, result[0])
      } else {
        return done(null, false)
      }
    })
  }));
}

注意,生成的token應該帶有統(tǒng)一的格式。一個正確的token應該是這樣的Bearer ${token},注意Bearer和生成的Token之間的空格。

接下來在需要校驗的地方驗證Token

// $router get api/user/current
// @desc return current user
// @access private
router.get("/current", passport.authenticate("jwt", { session: false }), (req, res) => {
  res.send({
    code: 1,
    msg: req.user
  })
})

驗證token如果通過,就會執(zhí)行passport.use里的方法,同時jwt_jpayload會輸出結(jié)果,得到結(jié)果后,我們在用id在User表中查詢數(shù)據(jù),然后通過req.user(數(shù)據(jù)庫表名)拿到。

// { id: 1, name: 'wz', iat: 1660299838, exp: 1660303438 }
console.log(jwt_payload);

2. express-jwt || jsonwebtoken生成Token驗證Token 安裝

npm install jsonwebtoken express-jwt
注意

jsonwebtoken用于生成JWT字符串

express-jwt用于將Jwt字符串解析為JSON對象

新建文件夾config/key.js

module.exports = {
  keyOringe: "secret"
}

將設置的key值暴露出去

在需要的地方引入

const jwt = require("jsonwebtoken")
    if (password == tools.setPassword(results[0].password)) {
      //如果成功,傳1,頁面跳轉(zhuǎn)交給vue
+      const rule = {
+        id: results[0].id,
+        adminname: results[0].adminname
+      }

+      const tokenstr = jwt.sign(rule, key.keyOringe, { expiresIn: 3600 })
+      res.send({

        code: 1,
        msg: '登陸成功',
+        token: tokenstr
      })
    }
  • 調(diào)用 jwt.sign() 方法生成JWT字符串 并通過 token 屬性發(fā)送給客戶端
  • 參數(shù)1: 用戶的信息對象
  • 參數(shù)2: 加密的密鑰
  • 參數(shù)3: 配置對象 可以配置當前 token 的有效期
  • rule只是抽離出去,其實直接寫也沒問題

在中間件中使用

const { expressjwt: jwt } = require("express-jwt")
const key = require('../config/key')

router.use(jwt({
  secret: key.keyOringe,
  algorithms: ["HS256"],
}).unless({ path: ["/admin/login", "/admin/register"] })
)

之后使用私有接口去訪問

//$route GET admin/banner/
//@desc 修改輪播圖接口
router.get('/', (req, res) => {
  console.log(req);
  res.send({
    code: 1,
    msg: '獲取用戶信息成功',
    data: req.auth
  })
})

這樣就會返回帶有用戶信息的Token了!

捕獲解析JWT失敗后產(chǎn)生的錯誤

當使用express-jwt解析Token字符串時,如果客戶端發(fā)送的Token字符串過期不合法,會產(chǎn)生一個解析失敗的錯誤,影響項目的正常運行,可以通過Express的錯誤中間件,捕獲這個錯誤并且進行相關(guān)的處理,示例代碼如下:

//在所有路由后面定義錯誤中間件
//使用全局錯誤處理中間件 捕獲解析 JWT 失敗后產(chǎn)生的錯誤
app.use((err, req, res, next) => {
  //判斷是否由 Token 解析失敗導致的
  if (err.name == 'UnauthorizedError') {
    return res.send({
      status: 401,
      message: '無效的Token'
    })
  }
  res.send({
    status: 500,
    message: '未知的錯誤'
  })
})

總結(jié)

到此這篇關(guān)于node.js配置Token驗證的2種方式總結(jié)的文章就介紹到這了,更多相關(guān)node.js配置Token驗證內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Nest.js使用multer實現(xiàn)文件上傳功能

    Nest.js使用multer實現(xiàn)文件上傳功能

    這篇文章主要為大家詳細介紹了Nest.js鵝湖使用multer實現(xiàn)文件上傳功能,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-03-03
  • 手把手教你用node.js搭建一個Web服務

    手把手教你用node.js搭建一個Web服務

    Web服務器一般指網(wǎng)站服務器,是指駐留于因特網(wǎng)上某種類型計算機的程序,下面這篇文章主要給大家介紹了關(guān)于用node.js搭建一個Web服務的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-04-04
  • node.js基于express使用websocket的方法

    node.js基于express使用websocket的方法

    這篇文章主要介紹了node.js基于express使用websocket的方法,結(jié)合實例形式分析了node.js基于express調(diào)用websocket相關(guān)設置與使用操作技巧,需要的朋友可以參考下
    2017-11-11
  • 淺談Node.js 沙箱環(huán)境

    淺談Node.js 沙箱環(huán)境

    本篇文章主要介紹了Node.js 沙箱環(huán)境 ,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • vscode無法運行npm命令的問題解決(cmd可行)

    vscode無法運行npm命令的問題解決(cmd可行)

    本文主要介紹了vscode無法運行npm命令的問題解決(cmd可行),VSCode無法調(diào)用npm可能是因為環(huán)境路徑配置錯誤,下面就來具體介紹一下原因及解決方法,感興趣的可以了解一下
    2024-04-04
  • node.js處理前端提交的GET請求

    node.js處理前端提交的GET請求

    這篇文章主要為大家詳細介紹了node.js處理前端提交的GET請求,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • Node.js中path.resolve與path.join的區(qū)別與作用詳解

    Node.js中path.resolve與path.join的區(qū)別與作用詳解

    path.resolve和path.join都是屬于path核心模塊下的方法,用來拼接路徑,下面這篇文章主要給大家介紹了關(guān)于Node.js中path.resolve與path.join的區(qū)別與作用的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • nodeJs鏈接Mysql做增刪改查的簡單操作

    nodeJs鏈接Mysql做增刪改查的簡單操作

    本篇文章主要介紹了nodeJs鏈接Mysql做增刪改查的簡單操作,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • Node 代理訪問的實現(xiàn)

    Node 代理訪問的實現(xiàn)

    這篇文章主要介紹了Node 代理訪問的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-09-09
  • VsCode與Node.js知識點詳解

    VsCode與Node.js知識點詳解

    在本篇文章中小編給大家分享了關(guān)于VsCode與Node.js的相關(guān)知識點以及安裝等內(nèi)容,需要的朋友們可以參考下。
    2019-09-09

最新評論

镇赉县| 门头沟区| 宁陕县| 明光市| 永顺县| 循化| 阿拉善右旗| 双流县| 舞钢市| 商南县| 平远县| 雷山县| 镇原县| 鄱阳县| 洛阳市| 建湖县| 景泰县| 体育| 临夏市| 聂荣县| 广元市| 景德镇市| 泗洪县| 观塘区| 齐齐哈尔市| 彭水| 潢川县| 都昌县| 安远县| 延寿县| 华容县| 政和县| 隆林| 瑞昌市| 鹤庆县| 普宁市| 石城县| 驻马店市| 丹巴县| 三原县| 绍兴县|