成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

NODE + JWT + Mongo(簡(jiǎn)單實(shí)現(xiàn)權(quán)限管理)

dmlllll / 2555人閱讀

摘要:此信息可以通過(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
簽名

應(yīng)用

知道了JWT的用途后,我們就開始針對(duì)授權(quán)來(lái)結(jié)合node做簡(jiǎn)單的實(shí)現(xiàn)。

版本號(hào)

[email protected]

[email protected]

[email protected]

流程

用戶還沒(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

相關(guān)文章

  • 4.4 權(quán)限攔截控制AccessToken jwt-博客后端Api-NodeJs+Express+

    摘要:權(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(...

    CoXie 評(píng)論0 收藏0
  • vue+node+mongodb 搭建一個(gè)完整博客

    摘要:開發(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)易...

    Miracle_lihb 評(píng)論0 收藏0
  • api權(quán)限管理系統(tǒng)與前后端分離實(shí)踐

    摘要:自己在前后端分離上的實(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...

    bawn 評(píng)論0 收藏0
  • api權(quán)限管理系統(tǒng)與前后端分離實(shí)踐

    摘要:自己在前后端分離上的實(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...

    tianlai 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<