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.