Nodejs Passport MySQL

#mysql #node.js #passport.js #passport-twitter

#mysql #node.js #passport.js #паспорт-twitter

Вопрос:

Я пытаюсь понять, как использовать nodejs Passport MySQL. Кажется, что почти каждый учебник использует MongoDB, и я не хочу этого делать. На самом деле некоторые быстрые поиски такого типа приведут к веб-страницам, таким как (http://nodejsrocks.blogspot.com/2012/04/nodejs-expressjs-mysql.html ) и видео на YouTube, в котором парень (https://www.youtube.com/watch?v=jGBbMVJx3h0 ) ничего не делая, кроме входа в систему, и кто знает, что он на самом деле использует, но у страницы было более 3 тысяч просмотров. Я надеюсь, что некоторые разработчики посмотрят на это и скажут, что, возможно, есть применение для чего-то вроде всеобъемлющего типа, отличного от MVC, с MySQL. Моя причина этого в том, что я пытаюсь получить только возможности iOS и Android и не нуждаюсь в больших накладных расходах на строительные леса. Только скрипты на стороне базы данных и сервера обрабатывают запросы и возвращают объекты JSON на телефоны.

Итак, при этом, может ли кто-нибудь, у кого был реальный опыт в этом, пожалуйста, помогите мне (и остальной мир пытается делать подобные вещи без каких-либо подробных руководств, потому что мы не используем MongoDB и полномасштабные строительные леса).

Таблицы, которые я настроил для «TwitterStrategy», — это пользователи (id (PK), имя пользователя, адрес электронной почты, соль, пароль) и twitterusers (id (PK), имя, screenname, местоположение, описание, url, img, токен, tokensecret).

Вот код, который я пытаюсь начать с одного main.js досье. Я знаю, что это не лучшая практика, и я планирую очистить ее позже, но сейчас я хотел бы понять, чего мне не хватает, и заставить все работать. Я был бы чрезвычайно признателен, если кто-нибудь сможет помочь, и я УВЕРЕН, что другие тоже найдут это очень полезным. Спасибо.

 var http  = require('http'),
    mysql = require('mysql'),
    url   = require('url'),
    crypto = require('crypto'),
    express = require('express'),
    flash = require('connect-flash'),
    passport = require('passport'),
    TwitterStrategy = require('passport-twitter').Strategy;

var db = mysql.createConnection({
    host     : "****",
    user     : "****",
    password : "****",
    port     : '****',
    database : '****' 
});

// Connect the connection to DB and throw error if exists
db.connect(function(err) {
    if (err) { 
        console.error('Error connecting to db');
        console.error(err);
        return;
    }
    console.log('Database connected');
});

var TWITTER_CONSUMER_KEY = "****";
var TWITTER_CONSUMER_SECRET = "****";

passport.use(new TwitterStrategy({
    consumerKey: TWITTER_CONSUMER_KEY,
    consumerSecret: TWITTER_CONSUMER_SECRET,
    callbackURL: 'http://127.0.0.1:3000/auth/twitter/callback'},
    function(accessToken, refreshToken, profile, done) {
        //db.query(SELECT ........ FROM ...... WHERE ........, function (err, user){
            if (err) {
                console.log(err);
            }
            if (!err amp;amp; user != null){
                done(null, result);
            } else {
                console.log(result);
            }
        })
        });
    }
));

passport.serializeUser(function(user, done) {
    console.log('serializeUser: '   user.id);
    done(null, user.id);
});

passport.deserializeUser(function(id, done) {
    db.query('SELECT * FROM users WHERE id = '   id, function(err, result) {
        if (err){
            console.log(err);
        } else {
        console.log(result);
        }
        if (!err) {
            done(null, result);
        } else {
            done(err, null);
        }
    });
});

var app = express();

app.set(function(){

    // app.set('views', __dirname   '/views'); // Definitely for some views which aren't being used here
    // app.set('view engine', 'jade'); // Using jade for views, not used
    // app.use(express.favicon()); // Not really sure this is important, should be web only
    app.use(express.logger('dev')); // Again, not really sure this is important
    app.use(express.bodyParser()); // Have no idea what this is used for
    app.use(express.methodOverride()); // Same no Fn clue
    app.use(express.cookieParser('what the F'));
    app.use(express.session());
    app.use(passport.initialize());
    app.use(passport.session());
    app.use(flash());
    // app.use(app.router); // Here again we are defining our routes in main, so shouldn't need this.
    // app.use(express.static(__dirname   '/public'));

});

var server = http.createServer(function(req, res) {
    console.log('url: '   req.url); 

    var params = url.parse(req.url, true)
    var path = params.pathname;
    if (path == '/signup') {
        console.log("User signing up");
        onSignUp(params, res);
    } else if (path == '/signin') {
        console.log("User signing in");
        onSignIn(params, res);
    } else if (path == '/auth/twitter'){
        passport.authenticate('twitter'),
        function(req, res){
            console.log('Twitter User Created or Signed In');
        }
    }
});

//Keep server alive and listening to requests with DB connected also
server.listen(3000);
  

Мне не хватает другой таблицы аутентификации? Что мне нужно поместить в оператор MySQL, где есть точки, чтобы я мог найти пользователя, и какие параметры передаются из пользовательского запроса для выполнения запроса, т. Е. Что это за идентификатор oauth, который я видел в руководствах, который передается из того, что кажетсяпользователь в Twitter для авторизации? Кроме того, чего я должен ожидать от этого обратного вызова из Twitter? В любом случае, я буду рад опубликовать все это где-нибудь, чтобы все остальные могли посмотреть сразу, у меня есть решение, сделанное так, чтобы все мы, использующие MySQL и node, не остались в стороне и должны искать в Google, чтобы найти что-то, что кажется, что оно должно быть легко доступно, вместо копийтот же самый точный учебник по nodejs MongoDB express (многие из которых устарели, за исключением ввода-вывода scotch, который выглядит очень хорошо, если вы хотите использовать mongo … могу ли я добавить экземпляры на Amazon стоимостью около 279 долларов США в месяц на низком уровне), который плавает и распространяетсяпочти у любого есть «учебник». Еще раз спасибо.

Комментарии:

1. На данный момент это старый пост, но на случай, если кто-нибудь зайдет сюда в будущем, взгляните на этот проект Github: github.com/manjeshpv/node-express-passport-mysql

2. Аутентификация на Javascript с использованием Passport, MySQL и Express

Ответ №1:

Попробуйте обернуть функцию стратегии в process.nextTick , например,

 passport.use(new TwitterStrategy({
    consumerKey: TWITTER_CONSUMER_KEY,
    consumerSecret: TWITTER_CONSUMER_SECRET,
    callbackURL: 'http://127.0.0.1:3000/auth/twitter/callback'},
    function(accessToken, refreshToken, profile, done) {
        process.nextTick(function(){
        // this is where you put logic to check the profile sent from twitter already in your DB or not, 
        // its totally up to you whether you keep a separate auth table for it or not
        // NB: there will be some unique value in profile that can be used for next references
        db.query(SELECT ........ FROM ...... WHERE ........, function (err, user){
            if (err) {
                console.log(err);
            }
            if (!err amp;amp; user != null){
                done(null, result);
            } else {
                console.log(result);
            }
        })
        });
       });
    }
));
  

у вас также должен быть маршрут для принятия обратного вызова, например,

 app.get('/auth/twitter/callback', function(req, res, next) {
   passport.authenticate('twitter', 
                           { }, 
                           function(err, user) {
                            // the result you send from the strategy function will be here
                            // do anything you like with the user send 
                           }

                         )(req, res, next);
});
  

Надеюсь, это прояснит ситуацию.