Nodejsでパスポートを設定し、mongooseと連携して、ユーザーがログインして新しいアカウントを作成できるようにします。
app.js:
var express = require('express')
, app = module.exports = express.createServer()
, passport = require('passport')
, LocalStrategy = require('passport-local').Strategy
, routes = require('./routes/index')(app) //index loads in multiple routes
, MongoDBConnection = require('./database/DatabaseConnector').MongoDBConnection;
// Configuration
app.configure(function(){
app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
app.use(express.cookieParser());
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.session({ secret: 'justdoit' }));
app.use(passport.initialize());
app.use(passport.session());
app.use(app.router);
app.use(express.static(__dirname + '/public'));
});
var mongoDbConnection = new MongoDBConnection();
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
mongoDbConnection.findUserById(id, function(err, user){
done(err, user);
});
});
passport.use(new LocalStrategy(
function(username, password, done) {
process.nextTick(function () {
mongoDbConnection.findUser(username, function(err, user) {
//conditions....
});
});
}
));
app.get('/', function(req, res){
res.render('index', { title: "Index", user: req.user });
});
app.get('/account', ensureAuthenticated, function(req, res){
res.render('account', { title: "Account", user: req.user });
});
app.get('/login', function(req, res){
res.render('login', { title: "Login", user: req.user, message: req.flash('error') });
});
app.post('/login',
passport.authenticate('local', {
successRedirect: '/account',
failureRedirect: '/login',
failureFlash: true })
);
function ensureAuthenticated(req, res, next) {
if (req.isAuthenticated()) { return next(); }
res.redirect('/login')
}
私の問題は、app.js(パスポートコードがある場所)ファイルが少し大きくなり、パスポートセクションを独自のスクリプトに移動して、app.jsの外部と独自のauth.jsにルートを設定しようとしたことです。ルートファイルを作成し、app.jsを介してルートを参照します。他のルートでは機能しますが、ログインなどのパスポート関連のルートでは、passport.authenicate()関数を起動するようには見えません。
とにかく、パスポートのルートと関数を独自のファイルに入れて、app.jsから呼び出し/ロードすることはできますか?
auth.js:
module.exports = function(app){
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
mongoDbConnection.findUserById(id, function(err, user){
done(err, user);
});
});
passport.use(new LocalStrategy(
function(username, password, done) {
process.nextTick(function () {
mongoDbConnection.findUser(username, function(err, user) {
if (err) {
return done(err);
}
if (!user) {
return done(null, false, { message: 'Unknown user ' + username });
}
if (user.password != password) {
return done(null, false, { message: 'Invalid password' });
}
return done(null, user);
});
});
}
));
app.get('/', function(req, res){
res.render('index', { title: "Index", user: req.user });
});
app.get('/account', ensureAuthenticated, function(req, res){
console.log("directing to the account page....");
res.render('account', { title: "Account", user: req.user });
});
app.get('/login', function(req, res){
res.render('login', { title: "Login", user: req.user, message: req.flash('error') });
});
app.post('/login',
passport.authenticate('local', {
successRedirect: '/account',
failureRedirect: '/login',
failureFlash: true })
);
function ensureAuthenticated(req, res, next) {
if (req.isAuthenticated()) { return next(); }
res.redirect('/login')
}
}
これが私がすることです。コードに合わせて調整するためにさらにサポートが必要な場合は、コメントしてください。
最初のステップ
パスポートコードを別のファイルに入れます。例えばpass.js。 (私はあなたがすでにそれをしているのを見ます)そして、そのファイルで、これの中にすべてのコードを入れてください:
module.exports = function(passport, LocalStrategy){
};
使用している他のものを関数入力に追加することを忘れないでください。あなたの場合、パスポートとLocalStrategyに加えて、入力としてmongoDbConnectionも追加する必要があります。
2番目のステップ
App.jsに、この行を含めます。可能であれば「app.listen」の直前で、すべてが適切に定義/宣言/含まれていることを確認します。
require('./pass.js')(passport, LocalStrategy);
説明
ステップ1の「ラッパー」は、アプリに含めるコードのチャンクを定義します。ステップ2の「require」は、実際にそれを含むコードです。基本的に、「pass.js」ファイル全体を関数として定義し、コードを実行するために必要なツール(passport、LocalStrategyなど)を渡します。
あなたの場合、おそらく私のコードを次のように変更する必要があります。
module.exports = function(passport, LocalStrategy, mongoDbConnection){
};
require('./pass.js')(passport, LocalStrategy, mongoDbConnection);
これは機能するはずです。私はしばらく前にこれについてグーグルで検索しました、そしてこれはあなたのapp.jsを分割するための「正しい」方法であるように見えます(私はこれを非常に恐れて言います:))。さらにサポートが必要な場合は、お気軽にコメントしてください。
このgithubリポジトリにもこの良い例があります。
https://github.com/madhums/nodejs-express-mongoose-demo
Server.jsファイルはapp.jsになります。また、/ config /passport.jsは含まれているパスポート設定です。
このために、app.jsでこれを行うことをお勧めします
require('./mypassport')(app);
そしてmypassport.js
var passport = require('passport')
, LocalStrategy = require('passport-local').Strategy
, MongoDBConnection = require('./database/DatabaseConnector').MongoDBConnection;
module.exports = function(app){
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
mongoDbConnection.findUserById(id, function(err, user){
done(err, user);
});
});
passport.use(new LocalStrategy(
function(username, password, done) {
process.nextTick(function () {
mongoDbConnection.findUser(username, function(err, user) {
if (err) {
return done(err);
}
if (!user) {
return done(null, false, { message: 'Unknown user ' + username });
}
if (user.password != password) {
return done(null, false, { message: 'Invalid password' });
}
return done(null, user);
});
});
}
));
}
ルジャンドルの答えに追加します。 module.exports = function()
は、nodejsで、ファイル、変数、または特定の機能をアプリケーション全体でグローバルに使用できるようにする方法です。
// anyfile.js
module.exports = function(){
//global code.
}
module.exports = function(app){
passport.serializeUser(function(user, done) {
done(null, user.id);
});
パスポートオブジェクトへの参照がないため、機能しない可能性がありますか?