如何使用express&mysql和jwt实现成员函数

zlhcx6iw  于 2021-06-19  发布在  Mysql
关注(0)|答案(1)|浏览(300)

我目前使用express&mysql实现了登录和成员身份函数。
我想加上jwt。
我只想通过postman创建一个api,而不是在web上,我听说我必须使用passport进行搜索。
我知道还有express generate,但是我想修改我当前的代码。
我是node.js的初学者,需要一个指南。
应用程序.js

var express = require('express');
var http = require('http');
var static = require('serve-static');
var path = require('path');

var bodyParser = require('body-parser');
var cookieParser = require('cookie-parser');
var expressSession = require('express-session');

var expressErrorHandler = require('express-error-handler');

var mysql = require('mysql');

var pool = mysql.createPool({
    connectionLimit:10,
    host:'localhost',
    user:'root',
    password:'password',
    database:'test',
    debug:false
});

var app = express();

app.set('port', 3000);

app.use('/public', static(path.join(__dirname, 'public')));

app.use(bodyParser.urlencoded({extended:false}));
app.use(bodyParser.json());

app.use(cookieParser());
app.use(expressSession({
    secret:'my key',
    resave: true,
    saveUninitialized:true
}));

var router = express.Router();

router.route('/process/login').post(function(req, res) {
    console.log('/process/login');

    var paramId = req.body.id;
    var paramPassword = req.body.password;
    console.log('request parameter:' + paramId + paramPassword);

    authUser(paramId, paramPassword, function(err, rows) {
        if (err) {
            console.log('error');
            res.writeHead(200, '{"Content-Type":"text/plain; charset=utf-8"}');
            res.write('<h1>error</h1>');
            red.end();
            return;
        }

        if (rows) {
            console.dir(rows);

            res.writeHead(200, '{"Content-Type":"text/plain; charset=utf-8"}');
            res.write('<h1>user login success</h1>');
            res.write('<div><p>user:' + rows[0].id + ' </p></div>');
            res.end();
        } else {
            res.writeHead(200, '{"Content-Type":"text/plain; charset=utf-8"}');
            res.write('<h1>user not found</h1>');
            res.end();
        }
    });
});

router.route('/process/adduser').post(function(req, res) {
    console.log('/process/adduser');

    var paramId = req.body.id;
    var paramPassword = req.body.password;

    console.log('request parameter' + paramId + paramPassword);

    addUser(paramId, paramPassword, function(err, addedUser) {
        if (err) {
            console.log('error');
            res.writeHead(200, '{"Content-Type":"text/plain; charset=utf-8"}');
            res.write('<h1>error</h1>');
            red.end();
            return;
        }

        if (addedUser) {
            console.dir(addedUser);

            res.writeHead(200, '{"Content-Type":"text/plain; charset=utf-8"}');
            res.write('<h1>user added</h1>');
            res.end();
        } else {
            res.writeHead(200, '{"Content-Type":"text/plain; charset=utf-8"}');
            res.write('<h1>user added fail</h1>');
            res.end();
        }
    });
})

app.use('/', router);

var addUser = function(id, password, callback) {
    console.log('addUser');

    pool.getConnection(function(err, conn) {
        if(err) {
            if (conn) {
                conn.release();
            }

            callback(err, null);
            return;
        }
        console.log('db threadid' + conn.threadId);

        var data = {id:id, password:password};
        var exec = conn.query('insert into users set ?', data, 
        function(err , result) {
            conn.release();
            console.log('SQL syntax' + exec.sql);

            if (err) {
                console.log('SQL error;');
                callback(err, null);
                return;
            }

            callback(null, result);
        });
    });
};

var authUser = function(id, password, callback) {
    console.log('authUser' + id + password);

    pool.getConnection(function(err, conn) {
        if (err) {
            if (conn) {
                conn.release();
            }

            callback(err, null);
            return;
        }
        console.log('db threadid:'+ conn.threadId);
        var tablename = 'users';
        var columns = ['id'];
        var exec = conn.query('select ?? from ?? where id = ? and password = ?', [columns, tablename, id, password],
        function(err, rows) {
            conn.release();
            console.log('SQL syntax' + exec.sql);

            if (err) {
                callback(err, null);
                return;
            }

            if (rows.length >0 ) {
                console.log('user find');
                callback(null, rows);
            } else {
                console.log('user not found');
                callback(null, null);
            }
        });
    });

};

var errorHandler = expressErrorHandler({
    static: {
        '404' : './public/404.html'
    }
});

app.use(expressErrorHandler.httpError(404));
app.use(errorHandler);

var server = http.createServer(app).listen(app.get('port'), function() {
    console.log('server start' + app.get('port'));
});
s2j5cfk0

s2j5cfk01#

您好@yori如果您想创建一个api,首先我建议您将数据解析为json对象,从而消除代码中的所有html标记。
为了使用jwt进行身份验证,您必须安装jsonwebtoken包作为项目依赖项的一部分:https://www.npmjs.com/package/jsonwebtoken
我建议您按照本文中的深入说明进行操作:https://medium.freecodecamp.org/securing-node-js-restful-apis-with-json-web-tokens-9f811a92bb52
不过,对于范围,这里有一些解释:
express可用于构建可供使用的健壮api。postman是开发人员用来查询api的gui工具。curl命令是最终的选择。jwt是一种安全的方式来代表双方之间转移的索赔。我认为有必要将这些术语分解给您,以便您了解每个工具之间的需要、相关性和差异。
按照本文中的指导,您将不得不对代码进行一点重构。

相关问题