如何使用Express&MySQL和JWT实现成员资格功能

时间:2018-09-18 17:37:39

标签: javascript mysql node.js express jwt

我目前使用Express&MySQL实现了登录和会员功能。

我想添加JWT。

我只想通过Postman而不是在Web上创建API,听说我必须使用Passport进行搜索。

我知道也有Express-generate,但是我想修改当前代码。

我是Node.js的初学者,需要指导。

app.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'));
});

1 个答案:

答案 0 :(得分:0)

您好@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是代表两方之间转移的索赔的一种安全方式。我认为有必要分解这些术语,以便您了解每种工具之间的需求,相关性和区别。

按照本文中的指南,您将不得不对代码进行一些重构。