2016-05-11 9 views
1

Also ich versuche, eine grundlegende Facebook-Integration mit Loopback und Passport zu tun, die Beispiel-App als Leitfaden: https://github.com/strongloop/loopback-example-passportLoopback Passport-Benutzer ist null

Ich glaube, ich bin fehlt eine kleine Sache, weil die req.user kommt immer wieder als null zurück, obwohl sich alles andere in einer Reihe zu befinden scheint. Dies führt dazu, dass die ensureLoggedIn(/failedLogin) jedes Mal zur fehlgeschlagenen Anmeldung führt.

Hier ist mein server.js:

var loopback = require('loopback'); 
var boot = require('loopback-boot'); 
var flash = require('express-flash'); 
var bodyParser = require('body-parser'); 

var app = module.exports = loopback(); 

// Creating a bit of passport 
var PassportConfigurator = require('loopback-component-passport').PassportConfigurator; 
var passportConfigurator = new PassportConfigurator(app); 

// Bootstrap the application, configure models, datasources and middleware. 
// Sub-apps like REST API are mounted via boot scripts. 
boot(app, __dirname, function(err) { 
    if (err) { 
    throw err; 
    } 
}); 

// Load the provider configurations 
var config = {}; 
try { 
    config = require('./providers.json'); 
} catch (err) { 
    console.error('Please configure your passport strategy in `providers.json`.'); 
    console.error('Copy `providers.json.template` to `providers.json` and replace the clientID/clientSecret values with your own.'); 
    process.exit(1); 
} 

// to support JSON-encoded bodies 
app.middleware('parse', bodyParser.json()); 
// to support URL-encoded bodies 
app.middleware('parse', bodyParser.urlencoded({ 
    extended: true 
})); 

// The access token is only available after boot 
app.middleware('auth', loopback.token({ 
    model: app.models.accessToken 
})); 

app.middleware('session:before', loopback.cookieParser(app.get('cookieSecret'))); 
app.middleware('session', loopback.session({ 
    secret: 'kitty', 
    saveUninitialized: true, 
    resave: true 
})); 

// We need flash messages to see passport errors 
app.use(flash()); 

// Initialize passport 
passportConfigurator.init(); 

// Set up related models 
passportConfigurator.setupModels({ 
    userModel: app.models.Participant, 
    userIdentityModel: app.models.userIdentity, 
    userCredentialModel: app.models.userCredential 
}); 
// Configure passport strategies for third party auth providers 
for (var s in config) { 
    var c = config[s]; 
    c.session = c.session !== false; 
    passportConfigurator.configureProvider(s, c); 
} 

app.start = function() { 
    // start the web server 
    return app.listen(function() { 
    app.emit('started'); 
    var baseUrl = app.get('url').replace(/\/$/, ''); 
    console.log('Web server listening at: %s', baseUrl); 
    if (app.get('loopback-component-explorer')) { 
     var explorerPath = app.get('loopback-component-explorer').mountPath; 
     console.log('Browse your REST API at %s%s', baseUrl, explorerPath); 
    } 
    }); 
}; 

// start the server if `$ node server.js` 
if (require.main === module) { 
    app.start(); 
} 

Und die routes.js:

var ensureLoggedIn = require('connect-ensure-login').ensureLoggedIn; 

module.exports = function(app) { 
    // Install a "/ping" route that returns "pong" 
    app.get('/loginFail', function(req, res) { 
    console.dir(req); 
    res.send(req.sessionID); 
    }); 

    app.get('/auth/account', ensureLoggedIn('/loginFail'), function (req, res, next) { 
    console.log('logged IN!'); 
    console.dir(req); 
    res.send(req.session); 
    }); 

    app.get('/auth/logout', function (req, res, next) { 
    console.log('logging out'); 
    req.logout(); 
    res.redirect('/'); 
    }); 
}; 

Durch am erf Objekt suchen, kann ich sehen, dass eine ordnungsgemäße accessToken es gibt und es ein Zugriffstoken passt in meine Datenbank (im Speicher).

Derzeit bekomme ich eine Umleitung auf /auth/account zu /loginFail gehen. Die Sitzung ist ziemlich leer, existiert aber. Die Sitzungs-ID existiert ebenfalls.

Jeder Einblick, was ich vermisse?

Antwort

1

Also habe ich mein Problem herausgefunden. Was ich getan habe, um es zu lösen, war, das Beispiel zu klonen und dann mit einem feinen Zahnkamm durchzugehen, um zu sehen, was die Unterschiede waren.

Es kam bis auf die Tatsache, dass ich nicht die Modelle hinzugefügt haben, die in das Modell-config.json benötigt wurden:

"user": { 
    "dataSource": "db", 
    "public": true 
}, 
"accessToken": { 
    "dataSource": "db", 
    "public": false 
}, 
"userCredential": { 
    "dataSource": "db", 
    "public": false 
}, 
"userIdentity": { 
    "dataSource": "db", 
    "public": false 
}, 
"ACL": { 
    "dataSource": "db", 
    "public": false 
}, 
"RoleMapping": { 
    "dataSource": "db", 
    "public": false 
}, 
"Role": { 
    "dataSource": "db", 
    "public": false 
} 

mir fehlte die ACL, RoleMapping und Role. Sie sind alle eingebaut, müssen aber im DB (durr) gespeichert werden.

Nur hoffen, dass dies jemand anderen hilft.