中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

如何實(shí)現(xiàn)Node登錄權(quán)限驗(yàn)證token驗(yàn)證

小編這次要給大家分享的是如何實(shí)現(xiàn)Node登錄權(quán)限驗(yàn)證token驗(yàn)證,文章內(nèi)容豐富,感興趣的小伙伴可以來了解一下,希望大家閱讀完這篇文章之后能夠有所收獲。

創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比東風(fēng)網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式東風(fēng)網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋東風(fēng)地區(qū)。費(fèi)用合理售后完善,十年實(shí)體公司更值得信賴。

1. token的使用場(chǎng)景

  • 無狀態(tài)請(qǐng)求
  • 保持用戶的登錄狀態(tài)
  • 第三方登錄(token+auth3.0)

2. 基于token的驗(yàn)證原理

后端不再存儲(chǔ)認(rèn)證信息,而是在用戶登錄的時(shí)候生成一個(gè)token,然后返回給前端,前端進(jìn)行存儲(chǔ),在需要進(jìn)行驗(yàn)證的時(shí)候?qū)oken一并發(fā)送到后端,后端進(jìn)行驗(yàn)證

加密的方式:對(duì)稱加密和非對(duì)稱加密,對(duì)稱加密指的是加密解密使用同一個(gè)密鑰,非對(duì)稱加密使用公鑰和私鑰,加密用私鑰加密,解密用公鑰解密

3. 基于Token的身份驗(yàn)證的過程如下:

客戶端:用戶名和密碼請(qǐng)求登錄

服務(wù)器:收到請(qǐng)求,驗(yàn)證用戶名和密碼,驗(yàn)證成功后,分發(fā)一個(gè)Token返回給客戶端

客戶端:將Token存儲(chǔ),例如放在 Cookie 里或者 Local Storage 里,后續(xù)每次請(qǐng)求,帶上此Token

服務(wù)器:收到請(qǐng)求,驗(yàn)證Token是否正確,驗(yàn)證成功返回請(qǐng)求數(shù)據(jù)

4. node + jwt(jsonwebtoken) 搭建token身份驗(yàn)證

安裝 ActivePerl https://www.activestate.com/activeperl/downloads或本地下載地址:https://www.jb51.net/softs/27286.html

安裝 OpenSSl http://slproweb.com/products/Win32OpenSSL.html或本地下載地址: https://www.jb51.net/softs/561776.html

在 ras 文件 終端夾下輸入 openssl

生成私鑰

openssl> genrsa -out ./private_key.pem 1024 

生成公鑰

openssl> rsa -in ./private_key.pem -pubout -out ./public_key.pem

下載包 jsonwebtoken

npm i jsonwebtoken -D         // 安裝jsonwebtoken模塊
const jwt = require('jsonwebtoken'); //引入包

通過私鑰生成 token,發(fā)送給前端

let private_key=fs.readFileSync(path.join(__dirname,'./private_key.pem'))
var token = jwt.sign(palyload, private_key,{ algorithm: 'RS256'});

后端接收 token 驗(yàn)證是否有 token,沒有則生成

前端把 token 存再 localStorage 或者 cookie 里

$.ajax({
   url:'http://localhost:3000/login',
   data: {
    username:username.value,
    password:password.value,
    // token:localStorage.getItem('token')
    token: cookieUtil('token')
   },
   method: "POST",
   success ( res ) {
    // const result = JSON.parse( res );
    const result = JSON.parse(res);
    console.log( result );
    if(result.auth){
     // localStorage.setItem('token', result.auth);
     cookieUtil('token', result.auth );
    }
   }
  })
 }

下次前端發(fā)送代 token 數(shù)據(jù)的請(qǐng)求

后端 使用公鑰 token驗(yàn)證( token解密 )

 // token驗(yàn)證( token解密 )
 
fs.readFile(path.join(__dirname,'../rsa/public_key.pem'),'utf8',(error,public_doc) =>{
  if( error ) throw error 
  var deencode = jwt.verify( jwt_token, public_doc )
})

完整代碼

const express = require('express');

const jwt = require('jsonwebtoken');
const path = require( 'path' );
const fs = require( 'fs' );

const router = new express.Router();

router.post('/', (req, res, next) => {

 
 const { username, password,token } = req.body;

  //讀取生成的私鑰文件
  let private_key = fs.readFileSync(path.join(__dirname,'../rsa/private_key.pem'));
 
  if(!token) { //生成的 token 唯一的,所以第一次沒有 koen 或者 token 過期是時(shí)才生成 token
    
   
   var jwt_token = jwt.sign({ username, password }, 
               private_key,
               { algorithm: 'RS256'} );
    
     // 公鑰解密 前端傳來的 token 
  
fs.readFile(path.join(__dirname,'../rsa/public_key.pem'),'utf8'(error,public_doc) =>{
     if( error ) throw error 
     var deencode = jwt.verify( jwt_token, public_doc )
     console.log(deencode );
    })

   res.render('login', {
    data: JSON.stringify({
     auth: jwt_token, //把生成的jwt 發(fā)給前端
     status: 1   //0 失敗, 1 登錄成功 2 登錄重復(fù)
    })
   })
  } else { //前端發(fā)來的 token 有值,說明是第二次登錄了或者token沒有過期,不用再生成 token 了
    res.render('login',{
    data: JSON.stringify({
     message: '登錄成功',
     status: 1 //0 失敗, 1 登錄成功 2 登錄重復(fù)
    })
    })
  } 
})

module.exports = router;

看完這篇關(guān)于如何實(shí)現(xiàn)Node登錄權(quán)限驗(yàn)證token驗(yàn)證的文章,如果覺得文章內(nèi)容寫得不錯(cuò)的話,可以把它分享出去給更多人看到。

網(wǎng)站欄目:如何實(shí)現(xiàn)Node登錄權(quán)限驗(yàn)證token驗(yàn)證
轉(zhuǎn)載源于:http://www.rwnh.cn/article44/pgseee.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化、App開發(fā)、云服務(wù)器面包屑導(dǎo)航、標(biāo)簽優(yōu)化、域名注冊(cè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)
共和县| 清苑县| 西城区| 乡宁县| 鄂托克前旗| 南安市| 舞钢市| 集贤县| 固安县| 玉田县| 安远县| 太原市| 淮阳县| 六安市| 无极县| 石渠县| 英德市| 老河口市| 嘉定区| 渝中区| 门源| 辽阳县| 虎林市| 台中市| 海伦市| 洪泽县| 衡阳市| 若尔盖县| 乐业县| 云阳县| 武宁县| 泰兴市| 彭水| 修武县| 灵宝市| 廊坊市| 二手房| 庆城县| 宁明县| 阳新县| 临猗县|