摘要:此信息可以通過(guò)數(shù)字簽名進(jìn)行驗(yàn)證和信任。用途授權(quán)和安全傳輸信息的結(jié)構(gòu)通常由兩部分組成令牌的類型,即,以及正在使用的散列算法,例如或。加密的數(shù)據(jù)簽名應(yīng)用知道了的用途后,我們就開始針對(duì)授權(quán)來(lái)結(jié)合做簡(jiǎn)單的實(shí)現(xiàn)。
JWT簡(jiǎn)介
官方是這樣介紹的:
JSON Web Token (JWT) is an open standard (RFC 7519) that defines a compact and self-contained way for securely transmitting information between parties as a JSON object. This information can be verified and trusted because it is digitally signed. JWTs can be signed using a secret (with the HMAC algorithm) or a public/private key pair using RSA or ECDSA.(JSON Web Token(JWT)是一個(gè)開放標(biāo)準(zhǔn)(RFC 7519),它定義了一種緊湊且獨(dú)立的方式,可以在各方之間作為JSON對(duì)象安全地傳輸信息。
此信息可以通過(guò)數(shù)字簽名進(jìn)行驗(yàn)證和信任。
JWT可以使用秘密(使用HMAC算法)或使用RSA或ECDSA的公鑰/私鑰對(duì)進(jìn)行簽名。)
用途
授權(quán)和安全傳輸信息
token的結(jié)構(gòu)
Header.Payload.Signature
Header
通常由兩部分組成:令牌的類型,即JWT,以及正在使用的散列算法,例如HMAC SHA256或RSA。
Payload
加密的數(shù)據(jù)
Signature
簽名
知道了JWT的用途后,我們就開始針對(duì)授權(quán)來(lái)結(jié)合node做簡(jiǎn)單的實(shí)現(xiàn)。
版本號(hào)
流程
用戶還沒(méi)登錄時(shí),只能訪問(wèn)首頁(yè)、注冊(cè)、登錄接口,如下圖
登錄過(guò)后能獲取自己的信息
如果沒(méi)輸入token,則提示沒(méi)有找到token,當(dāng)然可以重定位到首頁(yè)
輸入錯(cuò)誤的token,提示用戶未登錄
目錄結(jié)構(gòu)
說(shuō)明:config.js為全局配置文件,user.js為Mongo數(shù)據(jù)庫(kù)對(duì)應(yīng)的user實(shí)體,index.js為項(xiàng)目入口文件。
config.js
module.exports = { "network" : { "port":8080 }, "salt": "0vAXJ@2R%PAxL9*Y#vLc8VQuLGk0BzdD", "jwtsecret": "myjwttest", "database": "mongodb://127.0.0.1:27017/test" };
user.js
var mongoose = require("mongoose"); var Schema = mongoose.Schema; // 返回一個(gè)mongo用戶庫(kù)實(shí)例 module.exports = mongoose.model("User", new Schema({ name: String, password: String }));
index.js
const express = require("express"); const app = express(); const crypto = require("crypto"); const util = require("util"); const bodyParser = require("body-parser");//request.body起效果而用 const mongoose = require("mongoose");//MongoDB const jwt = require("jsonwebtoken"); // 使用jwt簽名 const config = require("./config"); // 引入配置 const User = require("./user"); // 引入mongo用戶庫(kù)實(shí)例 // 連接mongo mongoose.connect(config.database); // 設(shè)置加密秘鑰 app.set("superSecret", config.jwtsecret); //設(shè)置request.body有效 app.use(bodyParser.urlencoded({ extended: false })); app.use(bodyParser.json()); app.listen(config.network.port); // 首頁(yè) app.get("/", function (req, res) { res.send("這里是首頁(yè)http://127.0.0.1:" + config.network.port + "/api"); }); // 注冊(cè) app.post("/register", async function (req, res) { if (req.body.name && req.body.password) { const salt = config.salt; const pwdEnc = await util.promisify(crypto.pbkdf2)(req.body.password, salt.toString("base64"), 10000, 64, "sha256"); var user = new User({ name: req.body.name, password: pwdEnc }); user.save(function (err) { if (err) throw err; console.log("注冊(cè)成功"); res.json({ success: true }); }); } else { res.json({ success: false, msg: "錯(cuò)誤參數(shù)" }); } }); // 登錄,登錄成功返回JWT的Token 驗(yàn)證用戶名密碼 app.post("/login", function (req, res) { User.findOne({ name: req.body.name }, async function (err, user) { if (err) throw err; if (!user) { res.json({ success: false, message: "未找到授權(quán)用戶" }); } else if (user) { const salt = config.salt; const pwdEnc = await util.promisify(crypto.pbkdf2)(req.body.password, salt.toString("base64"), 10000, 64, "sha256"); if (user.password != pwdEnc) { res.json({ success: false, message: "用戶密碼錯(cuò)誤" }); } else { var token = await util.promisify(jwt.sign)({ user: user, }, app.get("superSecret"), { expiresIn: "4h", }); res.json({ success: true, message: "請(qǐng)使用您的授權(quán)碼", token: token }); } } }); }); // 創(chuàng)建需要授權(quán)的接口 var apiRoutes = express.Router(); //校驗(yàn)機(jī)制 apiRoutes.use(async function (req, res, next) { // 獲取傳過(guò)來(lái)的token var token = req.headers["x-access-token"]; if (token) { // 解碼token獲取用戶信息 decoded為加密前的內(nèi)容 util.promisify(jwt.verify)(token, app.get("superSecret")).then(function(data){ req.decoded = data; next(); //繼續(xù)下一步路由 }).catch((error)=>{ res.status(400).json({message: "用戶未登錄",error: error}); }); } else { // 沒(méi)有拿到token 返回錯(cuò)誤 return res.status(403).send({ success: false, message: "沒(méi)有找到token." }); } });
//獲取加密的信息 apiRoutes.get("/", function (req, res) { req.decoded.user.password = undefined; res.json(req.decoded.user); }); //獲取所有用戶 apiRoutes.get("/list", function (req, res) { User.find({}, function (err, users) { res.json(users); }); }); // 注冊(cè)API路由 app.use("/api", apiRoutes); ```
廣州蘆葦科技Java開發(fā)團(tuán)隊(duì)
蘆葦科技-廣州專業(yè)軟件外包服務(wù)公司
提供微信小程序、APP應(yīng)用研發(fā)、UI設(shè)計(jì)等專業(yè)服務(wù),專注于互聯(lián)網(wǎng)產(chǎn)品咨詢、品牌設(shè)計(jì)、技術(shù)研發(fā)等領(lǐng)域
訪問(wèn) www.talkmoney.cn 了解更多
萬(wàn)能說(shuō)明書 | 早起日記Lite | 凹凸壁紙 | 言財(cái)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/72598.html
摘要:權(quán)限控制業(yè)務(wù)需求查看用戶列表接口管理員才能使用更新用戶信息接口當(dāng)前對(duì)應(yīng)用戶才能調(diào)用這時(shí)候需要需要加入中間件來(lái)實(shí)現(xiàn)權(quán)限控制這時(shí)候咱們需要學(xué)習(xí)了解下課前學(xué)習(xí)了解入門教程基于的認(rèn)證版實(shí)現(xiàn)本文中使用了插件現(xiàn)將服務(wù)邏輯代碼附上服務(wù)配置設(shè)置創(chuàng) 權(quán)限控制 業(yè)務(wù)需求:查看用戶列表接口(管理員才能使用)、更新用戶信息接口(當(dāng)前對(duì)應(yīng)用戶才能調(diào)用) 這時(shí)候需要需要加入中間件來(lái)實(shí)現(xiàn)權(quán)限控制: showImg(...
摘要:開發(fā)一個(gè)完整博客流程前言前段時(shí)間剛把自己的個(gè)人網(wǎng)站寫完,于是這段時(shí)間因?yàn)槭虑椴皇翘?,便整理了一下,寫了個(gè)簡(jiǎn)易版的博客系統(tǒng)服務(wù)端用的是框架進(jìn)行開發(fā)技術(shù)棧目錄結(jié)構(gòu)講解的配置文件放置代碼文件項(xiàng)目參數(shù)配置的文件日志打印文件項(xiàng)目依賴模塊 Vue + Node + Mongodb 開發(fā)一個(gè)完整博客流程 前言 前段時(shí)間剛把自己的個(gè)人網(wǎng)站寫完, 于是這段時(shí)間因?yàn)槭虑椴皇翘?,便整理了一下,寫了個(gè)簡(jiǎn)易...
摘要:自己在前后端分離上的實(shí)踐要想實(shí)現(xiàn)完整的前后端分離,安全這塊是繞不開的,這個(gè)系統(tǒng)主要功能就是動(dòng)態(tài)管理,這次實(shí)踐包含兩個(gè)模塊基于搭建的權(quán)限管理系統(tǒng)后臺(tái)編寫的前端管理。 自己在前后端分離上的實(shí)踐 要想實(shí)現(xiàn)完整的前后端分離,安全這塊是繞不開的,這個(gè)系統(tǒng)主要功能就是動(dòng)態(tài)restful api管理,這次實(shí)踐包含兩個(gè)模塊,基于springBoot + shiro搭建的權(quán)限管理系統(tǒng)后臺(tái)bootshir...
摘要:自己在前后端分離上的實(shí)踐要想實(shí)現(xiàn)完整的前后端分離,安全這塊是繞不開的,這個(gè)系統(tǒng)主要功能就是動(dòng)態(tài)管理,這次實(shí)踐包含兩個(gè)模塊基于搭建的權(quán)限管理系統(tǒng)后臺(tái)編寫的前端管理。 自己在前后端分離上的實(shí)踐 要想實(shí)現(xiàn)完整的前后端分離,安全這塊是繞不開的,這個(gè)系統(tǒng)主要功能就是動(dòng)態(tài)restful api管理,這次實(shí)踐包含兩個(gè)模塊,基于springBoot + shiro搭建的權(quán)限管理系統(tǒng)后臺(tái)bootshir...
閱讀 1784·2021-09-22 15:10
閱讀 1277·2021-09-07 09:58
閱讀 2347·2019-08-30 15:44
閱讀 1648·2019-08-26 18:29
閱讀 2047·2019-08-26 13:35
閱讀 770·2019-08-26 13:31
閱讀 729·2019-08-26 11:42
閱讀 1074·2019-08-23 18:39