Node登錄權(quán)限驗(yàn)證token驗(yàn)證實(shí)現(xiàn)的方法示例
1. token的使用場(chǎng)景
- 無(wú)狀態(tài)請(qǐng)求
- 保持用戶(hù)的登錄狀態(tài)
- 第三方登錄(token+auth2.0)
2. 基于token的驗(yàn)證原理
后端不再存儲(chǔ)認(rèn)證信息,而是在用戶(hù)登錄的時(shí)候生成一個(gè)token,然后返回給前端,前端進(jìn)行存儲(chǔ),在需要進(jìn)行驗(yàn)證的時(shí)候?qū)oken一并發(fā)送到后端,后端進(jìn)行驗(yàn)證
加密的方式:對(duì)稱(chēng)加密和非對(duì)稱(chēng)加密,對(duì)稱(chēng)加密指的是加密解密使用同一個(gè)密鑰,非對(duì)稱(chēng)加密使用公鑰和私鑰,加密用私鑰加密,解密用公鑰解密
3. 基于Token的身份驗(yàn)證的過(guò)程如下:
客戶(hù)端:用戶(hù)名和密碼請(qǐng)求登錄
服務(wù)器:收到請(qǐng)求,驗(yàn)證用戶(hù)名和密碼,驗(yàn)證成功后,分發(fā)一個(gè)Token返回給客戶(hù)端
客戶(hù)端:將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或本地下載地址:http://www.dbjr.com.cn/softs/27286.html
安裝 OpenSSl http://slproweb.com/products/Win32OpenSSL.html或本地下載地址: http://www.dbjr.com.cn/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'); //引入包
通過(guò)私鑰生成 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,沒(méi)有則生成
前端把 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 唯一的,所以第一次沒(méi)有 koen 或者 token 過(guò)期是時(shí)才生成 token
var jwt_token = jwt.sign({ username, password },
private_key,
{ algorithm: 'RS256'} );
// 公鑰解密 前端傳來(lái)的 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ā)來(lái)的 token 有值,說(shuō)明是第二次登錄了或者token沒(méi)有過(guò)期,不用再生成 token 了
res.render('login',{
data: JSON.stringify({
message: '登錄成功',
status: 1 //0 失敗, 1 登錄成功 2 登錄重復(fù)
})
})
}
})
module.exports = router;
到此這篇關(guān)于Node登錄權(quán)限驗(yàn)證token驗(yàn)證實(shí)現(xiàn)的方法示例的文章就介紹到這了,更多相關(guān)Node登錄權(quán)限驗(yàn)證token驗(yàn)證內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
node.js學(xué)習(xí)之?dāng)嘌詀ssert的使用示例
assert 模塊主要用于編寫(xiě)程序的單元測(cè)試時(shí)使用,通過(guò)斷言可以提早發(fā)現(xiàn)和排查出錯(cuò)誤。下面這篇文章主要給大家介紹了關(guān)于node.js學(xué)習(xí)之?dāng)嘌詀ssert的相關(guān)資料,需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-09-09
node.js入門(mén)學(xué)習(xí)之url模塊
最近在學(xué)習(xí)nodejs,知道了如何用nodejs創(chuàng)建一個(gè)簡(jiǎn)單的小項(xiàng)目。例如如何創(chuàng)建一個(gè)服務(wù)器啦,例如http.createServer,還有根據(jù)不同的請(qǐng)求路徑來(lái)設(shè)置路由選擇啦,模塊引入,創(chuàng)建模塊啦,下面這篇文章主要介紹了node.js中url模塊的相關(guān)資料,需要的朋友可以參考下。2017-02-02
node.js使用yargs處理命令行參數(shù)操作示例
這篇文章主要介紹了node.js使用yargs處理命令行參數(shù)操作,結(jié)合實(shí)例形式分析了yargs庫(kù)的安裝及node.js使用yargs處理命令行參數(shù)具體實(shí)現(xiàn)技巧,需要的朋友可以參考下2020-02-02
Nodejs為什么選擇javascript為載體語(yǔ)言
準(zhǔn)備寫(xiě)一個(gè)NodeJS方面的系列文章,由淺入深,循序漸進(jìn),秉承的理念是重思想,多實(shí)踐,勤能補(bǔ)拙,貴在堅(jiān)持。本文首先來(lái)點(diǎn)基礎(chǔ)知識(shí)的開(kāi)篇吧。2015-01-01
Node.js實(shí)現(xiàn)連接mysql數(shù)據(jù)庫(kù)功能示例
這篇文章主要介紹了Node.js實(shí)現(xiàn)連接mysql數(shù)據(jù)庫(kù)功能,簡(jiǎn)單分析了nodejs連接數(shù)據(jù)庫(kù)的操作步驟與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-09-09
node.js中的fs.chownSync方法使用說(shuō)明
這篇文章主要介紹了node.js中的fs.chownSync方法使用說(shuō)明,本文介紹了fs.chownSync的方法說(shuō)明、語(yǔ)法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下2014-12-12

