前回からの続き。
仕上げに、app.jsを修正しましょう。
まずは、必要となるモジュールをrequireしておきます。
app.js(抜粋)
var flash = require('connect-flash')
, express = require('express')
, passport = require('passport')
, util = require('util')
, LocalStrategy = require('passport-local').Strategy
, routes = require('./routes')
, user = require('./routes/user')
, http = require('http')
, path = require('path')
, accounts = require('./accounts');
次に、Passportの初期設定をしておきます。
app.js(抜粋)
// all environments
app.configure(function(){
app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.cookieParser('fugafuga')); // set secret phrase
app.use(express.session({secret: 'hogehoge'})); // set secret
// Initialize Passport! Also use passport.session() middleware, to support
// persistent login sessions (recommended).
app.use(flash());
app.use(passport.initialize());
app.use(passport.session());
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));
});
passport.serializeUser(function(user, done) {
done(null, user); // ここの変数userが、ビューの○○.jadeに渡される。
});
passport.deserializeUser(function(obj, done) {
done(null, obj);
});
アカウント管理の準備もしておきましょう。
app.js(抜粋)
var findById = accounts.findById;
var findByUsername = accounts.findByUsername;
PassportはLoacalStrategyを使います。
その設定です。
app.js(抜粋)
passport.use(new LocalStrategy(
function(username, password, done) {
// asynchronous verification, for effect...
process.nextTick(function () {
// Find the user by username. If there is no user with the given
// username, or the password is not correct, set the user to `false` to
// indicate failure and set a flash message. Otherwise, return the
// authenticated `user`.
findByUsername(username, function(err, user) {
if (err) {
return done(err);
}
if (!user) {
return done(null, false, { message: 'Unknown user ' + username + ' or invalid password.' });
}
if (user.password != password) {
return done(null, false, { message: 'Unknown user ' + username + ' or invalid password.' });
}
return done(null, user);
})
});
}
));
最後に、各ページの設定(?)です。
app.js(抜粋)
app.get('/', routes.index);
app.get('/login', routes.login);
app.get('/signup', routes.signup);
app.post('/login',
passport.authenticate('local', { failureRedirect: '/login', failureFlash: true }),
function(req, res) {
res.redirect('/');
}
);
app.get('/logout', function(req, res){
req.logout();
res.redirect('/');
});
app.post('/signup', function(req, res){
accounts.signup(req, res, function(){
passport.authenticate('local', { failureRedirect: '/signup', successRedirect: '/', failureFlash: true });
res.redirect('/');
});
});
// launch server
http.createServer(app).listen(app.get('port'), function(){
console.log('Express server listening on port ' + app.get('port'));
});
以上です。
まだ、Node.jsでの開発に慣れていないので変なところもあるでしょうが、そこのところは多めにみてやってください。
ここまで作るのに、Webに散らばる先人達の知恵に助けられました。非常に感謝しております。