Как реализовать функции членства, используя Express & MySQL и JWT

0

В настоящее время я выполняю функции входа и членства с помощью Express & MySQL.

И я хочу добавить JWT.

Я хотел создать API только через Postman, а не в Интернете, и я слышал, что мне пришлось использовать 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'));
});
Теги:
express
jwt

1 ответ

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. curl-команды - это альтернатива терминала. JWT - это безопасный способ представления претензий между двумя сторонами. Я вижу необходимость сломать эти термины для вас, чтобы вы поняли необходимость, значимость и разницу между каждым инструментом.

Следуя руководству в этой статье, вам придется немного реорганизовать свой код.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню