简体   繁体   English

使用快递服务器,passport.js进行Twitter身份验证后,req.user未定义

[英]req.user undefined after twitter authentication using express sever, passport.js

There are many questions relating to getting a req.user undefined after social authentication, but I found none which could help me. 社会认证后,有很多问题与未定义req.user有关,但我发现没有任何问题可以帮助我。

I have been able to successfully use the example for using passport for twitter authentication: https://github.com/passport/express-4.x-twitter-example . 我已经能够成功使用将护照用于Twitter身份验证的示例: https : //github.com/passport/express-4.x-twitter-example I tried to follow this pattern as closely as possible but cannot seem to get it to work. 我试图尽可能地遵循这种模式,但是似乎无法使其正常工作。

Specifically, I am able to successfully authenticate, but the req.user is undefined. 具体来说,我能够成功进行身份验证,但是req.user是未定义的。 This makes no sense to me as my user data was returned no problem from the example. 这对我来说毫无意义,因为示例中返回的我的用户数据没有问题。

I'm not inclined to believe this is a middleware problem (as it has been for others) as the middleware is the same as that used in the example. 我不倾向于相信这是一个中间件问题(就像其他人一样),因为中间件与示例中使用的相同。 It could be something about having multiple domains, but I'm not sure what. 可能有多个域,但是我不确定。 All of this is being done on the localhost. 所有这些都在本地主机上完成。

In Twitter, the app is set up so that website is: 127.0.0.1:3000/signin and the callback url is: 127.0.0.1:2999/auth/twitter/return 在Twitter中,该应用程序已设置为网站为:127.0.0.1:3000/signin,回调URL为:127.0.0.1:2999/auth/twitter/return

As you can tell, my client is working on port 3000 and it is making calls to a server running on port 2999. 如您所知,我的客户端正在使用端口3000,并且正在对在端口2999上运行的服务器进行呼叫。

To briefly walk you through the code, the client on 127.0.0.1:3000/signin has a button which links to 127.0.0.1:2999/auth/twitter, thus initiating the authentication request. 为了简要介绍代码,位于127.0.0.1:3000/signin上的客户端具有一个链接到127.0.0.1:2999/auth/twitter的按钮,从而启动了身份验证请求。 Under the hood, the express server is created in server/index.js--server. 在后台,快速服务器是在server / index.js--server中创建的。 This imports the routes in routes/index.js, some of which the controller authenticate.js handles. 这会将路由导入到route / index.js中,其中的某些路由由controller authenticate.js处理。 As you can see, the oauth twitter request is made in authenticate.js. 如您所见,oauth twitter请求是在authenticate.js中提出的。 Again, authentication proceeds successfully, I am redirected to 127.0.0.1:3000/search. 再次,身份验证成功进行,我被重定向到127.0.0.1:3000/search。 However, as you can see in this.twitter_callback, I am printing the req.user and it is undefined. 但是,正如您在this.twitter_callback中所看到的,我正在打印req.user,它是未定义的。

Please note that I have redacted the consumer key/secret from my code. 请注意,我已经从代码中删除了使用者密钥/秘密。

server/index.js 服务器/ 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

routes/index.js 路线/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 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

Any help would be greatly, greatly appreciated. 任何帮助将不胜感激。

The problem was in how my twitter_callback route was specified. 问题在于如何指定我的twitter_callback路由。

If I change the callback to this: 如果我将回调更改为此:

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');
})

everything works fine. 一切正常。 I think this has something to do with the middleware not being applied correctly the initial way I wrote it. 我认为这与我最初编写中间件时未正确应用中间件有关。 Not exactly sure how I would rewrite it to export it, without using app.get in the twitter_callback though 虽然不确定在不使用twitter_callback的app.get的情况下如何重写它以将其导出

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM