0

Facebookでログインするためにeveryauthの例を使用しようとしています。認証が正常に実行されたことを示すeveryauthデバッグメッセージを出力しました。ただし、everyauth.loggedIn 変数は設定されていません。理由はわかりません。私は実際にこのようなコードを持っています

auth/facebook へのリンクがあるページがあります。ユーザーがそのリンクをクリックすると、ユーザーは Facebook 認証のために送信され、すべてが完了します。ただし、 everyauth.loggedIn を確認すると、常に未定義です

if(everyauth.loggedIn) {
   console.log('The user has logged in');
}

上記は、「/」URLにリクエストがあるときに確認しようとしているものです。これは、Facebook認証が実行された後です。ただし、常に未定義になります。ローカル変数、グローバル変数の問題が原因である可能性があります。everyauth 変数をいくつかのモジュールに渡しています。任意の提案をいただければ幸いです

app.js (高速アプリケーションのセットアップ)

var exp = require('express');
var app = exp.createServer();

var conf = require('/path/example/conf')
var everyauth = require('everyauth');

everyauth.debug = true;

var usersById = {};
var nextUserId = 0;

function addUser (source, sourceUser) {
  var user;
  user = usersById[++nextUserId] = {id: nextUserId};
  user[source] = sourceUser;
  return user;
}

var usersByFbId = {};
var usersByTwitId = {};

everyauth.everymodule
  .findUserById( function (id, callback) {
    callback(null, usersById[id]);
  });

everyauth
  .facebook
    .appId(conf.fb.appId)
    .appSecret(conf.fb.appSecret)
    .findOrCreateUser( function (session, accessToken, accessTokenExtra, fbUserMetadata) {
      return usersByFbId[fbUserMetadata.id] || (usersByFbId[fbUserMetadata.id] = addUser('facebook', fbUserMetadata));;
    })
    .redirectPath('/');

everyauth
  .twitter
    .consumerKey(conf.twit.consumerKey)
    .consumerSecret(conf.twit.consumerSecret)
    .findOrCreateUser( function (sess, accessToken, accessSecret, twitUser) {
      return usersByTwitId[twitUser.id] || (usersByTwitId[twitUser.id] = addUser('twitter', twitUser));;
    })
    .redirectPath('/');


app.root = __dirname;
global.host = 'local.host';

require('./app/config')(app, exp, everyauth);
require('./app/server/router')(app,everyauth);

app.listen(3000, function(){
    console.log("Express server listening on port %d in %s mode", app.address().port, app.settings.env);
});

config.js

module.exports = function(app, exp, everyauth) {

    app.configure(function(){
        app.set('views', app.root + '/app/server/views');
        app.set('view engine', 'jade');
        app.set('view options', { doctype : 'html', pretty : true });
        app.use(exp.bodyParser());
        app.use(exp.cookieParser());
        app.use(exp.session({ secret: 'super-duper-secret-secret' }));
        app.use(everyauth.middleware(app));
        app.use(exp.methodOverride());
        app.use(require('stylus').middleware({ src: app.root + '/app/public' }));
        app.use(exp.static(app.root + '/app/server'));
        app.use(exp.static(app.root + '/app/public'));
    });

router.js

var CT = require('./modules/country-list');
var AM = require('./modules/account-manager');
var EM = require('./modules/email-dispatcher');


var mongodb = require('mongodb');
module.exports = function(app, everyauth) {

    // main login page //

    app.get('/', function(req, res){
      console.log('Root page called');
      // This is the problem area. everyauth.loggedIn always comes out undefined
      if(everyauth.loggedIn) {
         console.log('The user has logged in');
      } 

    // check if the user's credentials are saved in a cookie //
        if (req.cookies.user == undefined || req.cookies.pass == undefined){
            res.render('login', { locals: { title: 'Hello - Please Login To Your Account'}});
        }   else{
    // attempt automatic login //
            AM.autoLogin(req.cookies.user, req.cookies.pass, function(o){
                if (o != null){
                    req.session.user = o;
                    res.redirect('/dashboard');
                }   else{
                    res.render('login', { locals: { title: 'Hello - Please Login To Your Account' }});
                }
            });
        }
    });


    app.post('/', function(req, res){
      console.log('app called');
        AM.manualLogin(req.param('user'), req.param('pass'), function(e, o){
            if (!o){
                res.send(e, 400);
            }   else{
                req.session.user = o;
                if (req.param('remember-me') == 'true'){
                    res.cookie('user', o.user, { maxAge: 900000 });
                    res.cookie('pass', o.pass, { maxAge: 900000 });
                }
                res.send(o, 200);
            }
        });
    });

    app.post('/feedback', function(req,res) {
    var server = new mongodb.Server('localhost',27017, {auto_reconnect: true}, {safe:true});
        var db = new mongodb.Db('clicker', server);

    db.open(function(err, db) {
            if(!err) {
                db.collection('feedback', function(err, collection) {
                    var currentTime = new Date().getTime();
                    var feedback = {value:req.param('feedback'), datetime:currentTime}; 
                    collection.insert(feedback);
                    db.close();
                });
            }      
        });
        res.send('ok', 200);

    });

// logged-in user homepage //

    app.get('/home', function(req, res) {
        if (req.session.user == null){
    // if user is not logged-in redirect back to login page //
            res.redirect('/');
        }   else{
            res.render('home', {
                locals: {
                    title : 'Control Panel',
                    countries : CT,
                    udata : req.session.user
                }
            });
        }
    });

    app.get('/dashboard', function(req, res) {
        if (req.session.user == null){
    // if user is not logged-in redirect back to login page //
            res.redirect('/');
        }   else{
            res.render('dashboard', {
                locals: {
                    title : 'Dashboard',
                    countries : CT,
                    udata : req.session.user
                }
            });
        }
    });

    app.post('/home', function(req, res){
        if (req.param('user') != undefined) {
            AM.update({
                user        : req.param('user'),
                name        : req.param('name'),
                email       : req.param('email'),
                country     : req.param('country'),
                pass        : req.param('pass')
            }, function(o){
                if (o){
                    req.session.user = o;
            // udpate the user's login cookies if they exists //
                    if (req.cookies.user != undefined && req.cookies.pass != undefined){
                        res.cookie('user', o.user, { maxAge: 900000 });
                        res.cookie('pass', o.pass, { maxAge: 900000 }); 
                    }
                    res.send('ok', 200);
                }   else{
                    res.send('error-updating-account', 400);
                }
            });
        }   else if (req.param('logout') == 'true'){
            res.clearCookie('user');
            res.clearCookie('pass');
            req.session.destroy(function(e){ res.send('ok', 200); });
        }
    });

// creating new accounts //

    app.get('/signup', function(req, res) {
        res.render('signup', {  locals: { title: 'Signup', countries : CT } });
    });

    app.post('/signup', function(req, res){
        AM.signup({
            name    : req.param('name'),
            email   : req.param('email'),
            user    : req.param('user'),
            pass    : req.param('pass'),
            country : req.param('country')
        }, function(e, o){
            if (e){
                res.send(e, 400);
            }   else{
                res.send('ok', 200);
            }
        });
    });

// password reset //

    app.post('/lost-password', function(req, res){
    // look up the user's account via their email //
        AM.getEmail(req.param('email'), function(o){
            if (o){
                res.send('ok', 200);
                EM.dispatchResetPasswordLink(o, function(e, m){
                // this callback takes a moment to return //
                // should add an ajax loader to give user feedback //
                    if (!e) {
                    //  res.send('ok', 200);
                    }   else{
                        res.send('email-server-error', 400);
                        for (k in e) console.log('error : ', k, e[k]);
                    }
                });
            }   else{
                res.send('email-not-found', 400);
            }
        });
    });

    app.get('/reset-password', function(req, res) {
        var email = req.query["e"];
        var passH = req.query["p"];
        AM.validateLink(email, passH, function(e){
            if (e != 'ok'){
                res.redirect('/');
            } else{
    // save the user's email in a session instead of sending to the client //
                req.session.reset = { email:email, passHash:passH };
                res.render('reset', { title : 'Reset Password' });
            }
        })
    });

    app.post('/reset-password', function(req, res) {
        var nPass = req.param('pass');
    // retrieve the user's email from the session to lookup their account and reset password //
        var email = req.session.reset.email;
    // destory the session immediately after retrieving the stored email //
        req.session.destroy();
        AM.setPassword(email, nPass, function(o){
            if (o){
                res.send('ok', 200);
            }   else{
                res.send('unable to update password', 400);
            }
        })
    });

// view & delete accounts //

    app.get('/print', function(req, res) {
        AM.getAllRecords( function(e, accounts){
            res.render('print', { locals: { title : 'Account List', accts : accounts } });
        })
    });

    app.post('/delete', function(req, res){
        AM.delete(req.body.id, function(e, obj){
            if (!e){
                res.clearCookie('user');
                res.clearCookie('pass');
                req.session.destroy(function(e){ res.send('ok', 200); });
            }   else{
                res.send('record not found', 400);
            }
        });
    });

    app.get('/reset', function(req, res) {
        AM.delAllRecords( );
        res.redirect('/print');
    });

    app.get('*', function(req, res) { res.render('404', { title: 'Page Not Found'}); });

};

    }
4

2 に答える 2

0

呼び出す必要があるようなエクスプレスヘルパーを有効にするeveryauth.loggedInには:

everyauth.helpExpress(app);
于 2012-12-28T22:13:33.280 に答える
-1

コードが機能しない理由がわかりません。正しく動作する例がありましたが、mongodb が必要です。試してみたい場合は、github にプッシュしてください。 githubへのリンク

于 2013-07-12T02:24:43.750 に答える