欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

1. 生成Token jwt passport實(shí)現(xiàn)生成和驗(yà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都是通過(guò)數(shù)據(jù)庫(kù)獲取過(guò)來(lái)的,所以用的這種方式

4.設(shè)置jwt.sign方法/生成token

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

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

5.驗(yàn)證token

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

我們需要在"驗(yàn)證Token"那里對(duì)Token進(jìn)行驗(yàn)證

2. 使用passpport-jwt||passport驗(yàn)證Token

passport

passport-jwt

1.安裝

npm install passport-jwt
npm i passport

2.使用

這是從npm摘抄過(guò)來(lái)的的示例方法

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);
    });
  }
));

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

初始化passport

app.use(passport.initialize());

passport-jwt

new JwtStrategy(options, verify)

3.實(shí)際使用

index.js(項(xiàng)目入口文件)

const passport = require("passport")

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

這里單獨(dú)抽離了passport配置文件,同時(shí)將上面引入的passprot進(jìn)行引入

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應(yīng)該帶有統(tǒng)一的格式。一個(gè)正確的token應(yīng)該是這樣的Bearer ${token},注意Bearer和生成的Token之間的空格。

接下來(lái)在需要校驗(yàn)的地方驗(yàn)證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
  })
})

驗(yàn)證token如果通過(guò),就會(huì)執(zhí)行passport.use里的方法,同時(shí)jwt_jpayload會(huì)輸出結(jié)果,得到結(jié)果后,我們?cè)谟胕d在User表中查詢數(shù)據(jù),然后通過(guò)req.user(數(shù)據(jù)庫(kù)表名)拿到。

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

2. express-jwt || jsonwebtoken生成Token驗(yàn)證Token 安裝

npm install jsonwebtoken express-jwt
注意

jsonwebtoken用于生成JWT字符串

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

新建文件夾config/key.js

module.exports = {
  keyOringe: "secret"
}

將設(shè)置的key值暴露出去

在需要的地方引入

const jwt = require("jsonwebtoken")
    if (password == tools.setPassword(results[0].password)) {
      //如果成功,傳1,頁(yè)面跳轉(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字符串 并通過(guò) token 屬性發(fā)送給客戶端
  • 參數(shù)1: 用戶的信息對(duì)象
  • 參數(shù)2: 加密的密鑰
  • 參數(shù)3: 配置對(duì)象 可以配置當(dāng)前 token 的有效期
  • rule只是抽離出去,其實(shí)直接寫也沒問題

在中間件中使用

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
  })
})

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

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

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

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

總結(jié)

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

相關(guān)文章

  • 基于Nodejs實(shí)現(xiàn)文件壓縮和解壓功能

    基于Nodejs實(shí)現(xiàn)文件壓縮和解壓功能

    在?windows?系統(tǒng)上面,我們壓縮文件,常常需要安裝一些壓縮軟件才能實(shí)現(xiàn)壓縮,可能有些還存在一些問題,所以本文就來(lái)使用Nodejs實(shí)現(xiàn)文件壓縮和解壓功能吧
    2024-03-03
  • 在Node.js中實(shí)現(xiàn)視頻列表的分頁(yè)展示功能

    在Node.js中實(shí)現(xiàn)視頻列表的分頁(yè)展示功能

    在Web應(yīng)用開發(fā)中,展示大量數(shù)據(jù)時(shí)經(jīng)常會(huì)用到分頁(yè)功能,以提升用戶體驗(yàn)和頁(yè)面加載性能,本篇博客將介紹如何在使用Node.js和MongoDB的項(xiàng)目中實(shí)現(xiàn)視頻列表的分頁(yè)展示,文中有相關(guān)的代碼示例,需要的朋友可以參考下
    2024-04-04
  • Node.js中的模塊路徑解析規(guī)則和子模塊包

    Node.js中的模塊路徑解析規(guī)則和子模塊包

    NodeJS特性如事件驅(qū)動(dòng)、異步編程、無(wú)阻塞IO,這些特性為它帶來(lái)了高效的性能和更少的代碼,require函數(shù)支持斜杠(/)或盤符(C:)開頭的絕對(duì)路徑,也支持./開頭的相對(duì)路徑,為了便于管理和使用,我們可以把由多個(gè)子模塊組成的大模塊稱做包,并把所有子模塊放在同一個(gè)目錄里
    2023-11-11
  • node.js中的fs.exists方法使用說(shuō)明

    node.js中的fs.exists方法使用說(shuō)明

    這篇文章主要介紹了node.js中的fs.exists方法使用說(shuō)明,本文介紹了fs.exists方法說(shuō)明、語(yǔ)法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • Node.js學(xué)習(xí)之內(nèi)置模塊fs用法示例

    Node.js學(xué)習(xí)之內(nèi)置模塊fs用法示例

    這篇文章主要介紹了Node.js學(xué)習(xí)之內(nèi)置模塊fs用法,結(jié)合實(shí)例形式詳細(xì)分析了node.js內(nèi)置模塊fs的基本功能、用法與相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2020-01-01
  • 使用travis-ci如何持續(xù)部署node.js應(yīng)用詳解

    使用travis-ci如何持續(xù)部署node.js應(yīng)用詳解

    最近在學(xué)習(xí)使用 travis-ci 對(duì)項(xiàng)目進(jìn)行持續(xù)集成測(cè)試,所以下面這篇文章主要給大家介紹了關(guān)于使用travis-ci如何持續(xù)部署node.js應(yīng)用的相關(guān)資料,文中介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-07-07
  • Node.js環(huán)境下Koa2添加travis ci持續(xù)集成工具的方法

    Node.js環(huán)境下Koa2添加travis ci持續(xù)集成工具的方法

    這篇文章主要給大家介紹了在Node.js環(huán)境下Koa2添加travis ci持續(xù)集成工具的方法,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編一起來(lái)學(xué)習(xí)學(xué)習(xí)吧。
    2017-06-06
  • 在Node.js中使用Express實(shí)現(xiàn)視頻評(píng)論的列表展示和刪除功能

    在Node.js中使用Express實(shí)現(xiàn)視頻評(píng)論的列表展示和刪除功能

    在現(xiàn)代Web應(yīng)用中,視頻內(nèi)容和互動(dòng)功能(如評(píng)論)的結(jié)合極大地增加了用戶的參與度,本文將通過(guò)一個(gè)具體的例子,展示如何在Node.js環(huán)境中使用Express框架來(lái)實(shí)現(xiàn)視頻評(píng)論的列表展示和刪除功能,需要的朋友可以參考下
    2024-04-04
  • node.js中的querystring.stringify方法使用說(shuō)明

    node.js中的querystring.stringify方法使用說(shuō)明

    這篇文章主要介紹了node.js中的querystring.stringify方法使用說(shuō)明,本文介紹了querystring.stringify的方法說(shuō)明、語(yǔ)法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • Zabbix添加Node.js監(jiān)控的方法

    Zabbix添加Node.js監(jiān)控的方法

    這篇文章主要介紹了Zabbix添加Node.js監(jiān)控的方法,非常不錯(cuò)具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2016-10-10

最新評(píng)論