2016-04-02 12 views
0

Es gibt viele Fragen im Zusammenhang mit einem req.user undefined nach sozialer Authentifizierung, aber ich fand keine, die mir helfen könnte.req.user undefined nach Twitter-Authentifizierung mit Express-Server, pass.js

Ich konnte erfolgreich das Beispiel für die Verwendung von Reisepass für die Twitter-Authentifizierung verwenden: https://github.com/passport/express-4.x-twitter-example. Ich habe versucht, diesem Muster so nahe wie möglich zu folgen, aber ich kann es nicht zum Laufen bringen.

Insbesondere kann ich erfolgreich authentifizieren, aber der req.user ist nicht definiert. Das ergibt für mich keinen Sinn, da meine Benutzerdaten problemlos zurückgegeben wurden.

Ich bin nicht geneigt zu glauben, dass dies ein Middleware-Problem ist (wie es für andere war), da die Middleware die gleiche ist wie im Beispiel. Es könnte etwas über mehrere Domänen haben, aber ich bin mir nicht sicher was. All dies geschieht auf dem lokalen Host.

In Twitter wird die App so einrichten, dass Website ist: 127.0.0.1:3000/signin und die Rückruf-URL ist: 127.0.0.1:2999/auth/twitter/return

Wie Sie kann sagen, mein Klient arbeitet an Port 3000 und er macht Anrufe zu einem Server, der auf Port 2999 läuft.

Um Sie kurz durch den Code zu führen, hat der Klient auf 127.0.0.1:3000/signin einen Knopf, der verbindet zu 127.0.0.1:2999/auth/twitter, wodurch die Authentifizierungsanforderung eingeleitet wird. Unter der Haube wird der Express-Server in server/index.js - server erstellt. Dies importiert die Routen in routes/index.js, von denen einige vom Controller authenticate.js behandelt werden. Wie Sie sehen können, wird die oauth twitter Anfrage in authenticate.js gemacht. Auch hier läuft die Authentifizierung erfolgreich ab, ich werde auf 127.0.0.1:3000/search umgeleitet. Wie Sie jedoch in diesem.twitter_callback sehen können, drucke ich den req.user und es ist nicht definiert.

Bitte beachten Sie, dass ich den Consumer Key/Secret von meinem Code entfernt habe.

server/index.js

var cors = require('cors') 
var bodyParser = require('body-parser') 
var express = require('express'); 
var app = express(); 
var http = require('http').Server(app) 
var io = require('socket.io')(http) 
// NOT SURE WHY I NEED TO GO BACK 3 FOLDERS TO GET TO PORT_CONFIG 
var port = require("../port_config.json").server_port; 
var PORT = Number(process.env.PORT || port); 
var routes = require('./routes/index.js') 
var database = require('./database/db.js') 
var db = new database() 

app.use(cors()); // middleware that allows cross-platform requests 
app.use(bodyParser.json()); 

db.dbConnect(function(err,db_instance){ 
    // routes 
    routes(app, db_instance, io) 
    // send user polls on connection 
    // TEMPORARY (WILL BE GRABBED ON LOGIN) 
    var user = null // WILL BE SET AFTER LOGIN 
    io.on('connection', function(socket) { 
    var places_attending = db_instance.collection('places_attending') 
    places_attending.find({}).toArray(function(err,docs){ 
     var places_user_attending = docs.map(doc => { 
      if (doc.attending.indexOf(user) !== -1) { 
       return { 
        id: doc.id, 
        name: doc.name, 
        num_attending: doc.attending.length 
       } 
      } 
     }) 
     socket.emit('places_user_attending', places_user_attending); 
    }) 
    }) 
}) 

http.listen(PORT, function() { 
    console.log('Backend server listening at http://localhost:' +  PORT); 
}) 

module.exports = http 

Routen/index.js

var Search = require('../controllers/search.js') 
var Add = require('../controllers/add.js') 
var Authenticate = require('../controllers/authenticate.js') 


module.exports = function(app, db, io) { 
    var search = new Search(db, io) 
    var add = new Add(db, io) 
    var authenticate = new Authenticate(app) 

    app.route('/api/search') 
     .post(search.search_yelp) 

    app.route('/api/add') 
     .post(add.add_attendee) 

    app.route('/auth/twitter') 
     .get(authenticate.twitter_authentication) 

    app.route('/auth/twitter/return') 
     .get(authenticate.twitter_callback) 
} 

authenticate.js

function authenticate(app) { 

var passport = require('passport'); 
var Strategy = require('passport-twitter').Strategy; 


// Configure the Twitter strategy for use by Passport. 
passport.use(new Strategy({ 
    consumerKey: REDACTED, 
    consumerSecret: REDACTED, 
    callbackURL: 'http://127.0.0.1:2999/auth/twitter/return' 
    }, 
    function(token, tokenSecret, profile, cb) { 
    // In this example, the user's Twitter profile is supplied as the user 
    // record. In a production-quality application, the Twitter profile should 
    // be associated with a user record in the application's database, which 
    // allows for account linking and authentication with other identity 
    // providers. 
    return cb(null, profile); 
    })); 


// Configure Passport authenticated session persistence. 
passport.serializeUser(function(user, cb) { 
    cb(null, user); 
}); 

passport.deserializeUser(function(obj, cb) { 
    cb(null, obj); 
}); 


// Use application-level middleware for common functionality, including 
// logging, parsing, and session handling. 
app.use(require('morgan')('combined')); 
app.use(require('cookie-parser')()); 
app.use(require('body-parser').urlencoded({ extended: true })); 
app.use(require('express-session')({ secret: 'keyboard cat', resave:  true, saveUninitialized: true })); 

// Initialize Passport and restore authentication state, if any, from the 
// session. 
app.use(passport.initialize()); 
app.use(passport.session()); 

this.twitter_authentication = passport.authenticate('twitter') 

this.twitter_callback = (
    passport.authenticate('twitter', { failureRedirect: 'http://127.0.0.1:3000/signin' }), 
    function(req, res) { 
     console.log('REQ.USER OBJECT: ' + req.user) 
     res.redirect('http://127.0.0.1:3000/search'); 
    } 
) 

} 

module.exports = authenticate 

Jede Hilfe sehr wäre sehr geschätzt.

Antwort

0

Das Problem war, wie meine twitter_callback Route angegeben wurde.

Wenn ich ändern, den Rückruf an diese:

this.twitter_callback = app.get('/auth/twitter/return', 
passport.authenticate('twitter', { failureRedirect: 'http://127.0.0.1:3000/signin' }), 
function(req, res) { 
console.log(req.user) 
res.redirect('http://127.0.0.1:3000/search'); 
}) 

alles funktioniert. Ich denke, das hat etwas damit zu tun, dass die Middleware nicht so richtig angewendet wird, wie ich sie geschrieben habe. Nicht genau sicher, wie ich es umschreiben würde, um es zu exportieren, ohne app.get im twitter_callback zu verwenden, obwohl

Verwandte Themen