パスポートローカルを使用したユーザー認証時にソケット接続が開始されるエクスプレスサーバーをセットアップしようとしています。パスポートを構成するファイルの最終行に、「TypeError: オブジェクトは関数ではありません」というエラーが表示されます。
これは私のpassport.jsファイルです:
var LocalStrategy = require('passport-local').Strategy;
var Player = require('../app/models/playerModel.js');
module.exports = function(passport) {
passport.serializeUser(function(player, done) {
done(null, player.id);
});
passport.deserializeUser(function(id, done) {
Player.findById(id, function(err, player) {
done(err, player);
});
});
//login
passport.use('local-login', new LocalStrategy({
usernameField : 'username',
passwordField : 'password',
passReqToCallback : true
},
function(req, username, password, done) { // callback with username and password from our form
// find a user whose username is the same as the forms username
// we are checking to see if the user trying to login already exists
Player.findOne({ 'local.username' : username }, function(err, player) {
// if there are any errors, return the error before anything else
if (err)
return done('test' + err);
// if no user is found, return the message
if (!player)
return done(null, false, console.log('No user found.'));
// if the user is found but the password is wrong
if (!player.validPassword(password))
return done(null, false, console.log('Oops! Wrong password.'));
// THIS IS THE LINE THAT THROWS THE ERROR
return done(null, player);
});
}));
};
ここに私のserver.jsファイルがあります:
var
express = require('express'), // framework
http = require('http'),
io = require('socket.io'),
mongoose = require('mongoose'), // object modeling for mongodb
passport = require('passport'), // user authentication and authorization
passportSocketIo = require('passport.socketio'),
routes = require('./app/routes.js'),
configDB = require('./config/database.js'),
MemoryStore = express.session.MemoryStore,
sessionStore = new MemoryStore(),
app = express(),
server = http.createServer(app),
port = process.env.PORT || 8080;
mongoose.connect(configDB.url); // connect to our database
require('./config/passport')(passport); // pass passport for configuration
app.configure(function() {
// set up our express application
app.use(express.logger('dev')); // log every request to the console
app.use(express.cookieParser()); // read cookies (needed for auth)
app.use(express.bodyParser()); // get information from html forms
app.use(express.methodOverride()); // used for creating RESTful services
app.use(express.static( __dirname + '/app')); // defines root directory for static files
// required for passport
app.use(express.session({ secret: 'secret', key: 'express.sid' , store: sessionStore})); // session secret
app.use(passport.initialize());
app.use(passport.session()); // persistent login sessions
});
routes.configRoutes(app, server, passport); // load our routes and pass in our app and fully configured passport
server.listen(port);
io = io.listen(server);
io.set('authorization', passportSocketIo.authorize({
cookieParser: express.cookieParser,
key: 'express.sid', // the name of the cookie where express/connect stores its session_id
secret: 'session_secret', // the session_secret to parse the cookie
store: sessionStore,
success: onAuthorizeSuccess, // *optional* callback on success - read more below
fail: onAuthorizeFail, // *optional* callback on fail/error - read more below
}));
function onAuthorizeSuccess(data, accept){
console.log('successful connection to socket.io');
accept(null, true);
}
function onAuthorizeFail(data, message, error, accept){
if(error)
throw new Error(message);
accept(null, false);
}
ログインを処理するroutes.jsの一部:
app.get('/login', function(req, res) {
console.log("log in");
});
// process the login form
app.post('/login', passport.authenticate('local-login', {
successRedirect : '/', // redirect to the secure profile section
failureRedirect : '/test', // redirect back to the signup page if there is an error
failureFlash : true // allow flash messages
}));
io.set('authorization' 関数をコメントアウトすると、ユーザーは認証されているように見えます。この関数は、パスポート認証関数を使用してソケット接続を確立できるようにするだけだと思っていました。ソケット接続を開始しようとしたときに認証しますか?
認証の仕組みを完全に理解しているとは思いません。ログイン フォームを送信すると、「dirname/login」に投稿が送信されます。これは、routes.js ファイルで処理されます。Passport.authenticate は、投稿が受信されたときに実行されるコールバックであり、データベースでプレーヤーを検索し、正しいユーザー名とパスワードが受信された場合、プレーヤー オブジェクトがシリアル化されてセッションに追加されます。socket.io の出番はどこですか? io.set('authorization' 関数は、ユーザーがいつ認証されるかを確認するリスナーを追加しますか?
コードの壁で申し訳ありません。私はノードが初めてで、プロセスを完全には理解していません。