簡體   English   中英

使用 JWT 在 json-server 上授權

[英]Authorizarion on json-server with a JWT

我正在嘗試制作一個使用typicode json-server的節點應用程序,我想向該應用程序添加授權,其中 GET 請求對所有公眾開放,但 PUT、POST 和 DELETE 請求需要一個 JWT 令牌,只有這樣他們才能繼續api。

我試圖制作一個小應用程序,但我無法弄清楚授權的下一部分以及如何在節點上使用中間件,因為我是前端開發人員。

這是我編寫的應用程序。

    const jsonServer = require('json-server')
    const app = jsonServer.create()
    const router = jsonServer.router('db.json')
    const middlewares = jsonServer.defaults()
    const morgan = require('morgan');
    const jwt = require('jsonwebtoken');
    const config = require('./config');
    const bodyParser = require('body-parser');

    app.set('Secret', config.secret);
    app.use(morgan('dev'));
    app.use(bodyParser.urlencoded({ extended: true }));
    app.use(bodyParser.json());

    app.use(middlewares)
    app.use((req, res, next) => {
        if (req.method === 'GET') {
            console.log(req);
            next();
        } else {
            if (req.path === '/login') {
                getToken(req, res);
            }
            if (isAuthorized(req, res)) {
                console.log("I am here");
                next();
            } else {
                console.log("I am in error");
                res.sendStatus(401)
            }
        }
    })
    app.use(router)
    app.listen(3000, () => {
        console.log('JSON Server is running on 3000')
    })

    function isAuthorized(req, res) {

        console.log("sadasdasdasd");

        var token = req.headers['access-token'];
        console.log(token);
        // decode token
        if (token) {
            console.log("Inside token");
            jwt.verify(token, app.get('Secret'), (err, decoded) => {
                console.log("Inside JWT fn");
                if (err) {
                    console.log("Inside JWT fn err");
                    return res.json({ message: 'invalid token' });
                } else {
                    console.log("Inside JWT fn success");
                    req.decoded = decoded;
                    return true;
                }
            });

        } else {
            // if there is no token  
            res.send({
                message: 'No token provided.'
            });
        }
    }

    function getToken(req, res) {
        if (req.body.username === "test") {
            if (req.body.password === 123) {
                const payload = {
                    check: true
                };
                var token = jwt.sign(payload, app.get('Secret'), {
                    expiresIn: 1440 // expires in 24 hours
                });
                res.json({
                    message: 'Authentication Successful ',
                    token: token
                });
            } else {
                res.json({
                    error: 'Invalid Password',
                });
            }
        } else {
            res.json({
                error: 'Please provide valid credentials',
            });
        }
    } 

你做得對。 但是,您的isAuthorized中間件存在一些問題。 在中間件中你有一個異步動作( jwt.verify ),那么你不能把這個函數作為json-server官方文檔中的“輔助函數”(函數返回布爾值)。

isAuthorized成為一個中間件,你就像一個中間件:

function isAuthorized(req, res, next) { // Pass 3 parmas to a express middleware 

  console.log("sadasdasdasd");

  var token = req.headers['access-token'];
  console.log(token);
  // decode token
  if (token) {
    console.log("Inside token");
    jwt.verify(token, app.get('Secret'), (err, decoded) => {
      console.log("Inside JWT fn");
      if (err) {
        console.log("Inside JWT fn err");
        return res
          .status(401) // I think will be better if you throw http status is 401 to client
          .json({ message: 'invalid token' });
      } else {
        console.log("Inside JWT fn success");
        req.decoded = decoded;
        return next(); // Only call "next" if everything is good, continue next jobs - handle secured requests
      }
    });

  } else {
    // if there is no token  
    return res
    .status(401)
    .send({
      message: 'No token provided.'
    });
  }
}

使用中間件

    app.use((req, res, next) => {
        if (req.method === 'GET') {
            console.log(req);
            next();
        } else {
            if (req.path === '/login') {
                getToken(req, res);
            }
            isAuthorized(req, res, next); // Here
        }
    })

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM