#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);
});
Надеюсь, это прояснит ситуацию.