0

我正在使用Passport在我的 Node.js 应用程序中进行 Google 身份验证。我在 Heroku 上托管它。我面临的问题是它没有返回到我在 nodejs 代码中指定的成功回调。我期待Succesfuly logged in成功登录的消息。当我检查 Heroku 日志时,它显示“请求超时”

这是我的 Node.js 代码

var express = require('express')
  , routes = require('./routes')
  , user = require('./routes/user')
  , http = require('http')
  , path = require('path');

var app = express();

var hbs = require('hbs');

var passport = require('passport')
  , GoogleStrategy = require('passport-google').Strategy;

passport.use(new GoogleStrategy({
    returnURL: 'http://floating-citadel-4714.herokuapp.com/auth/google/return',
    realm: 'http://floating-citadel-4714.herokuapp.com'
    },
    function(identifier, profile, done){
        console.log('Success');
        console.log(identifier);
        console.log(profile);
            }
            ));

// all environments
app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.set('view engine', 'html');
app.engine('html',hbs.__express);
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));

// development only
if ('development' == app.get('env')) {
  app.use(express.errorHandler());
}


app.get('/auth',function(req,resp){
    resp.sendfile('./views/auth.html');
});
app.get('/auth/google',passport.authenticate('google'));
app.get('/auth/google/return',
        passport.authenticate('google', { successRedirect: '/success',
                          failureRedirect: '/error' }));
app.get('/success',function(req,resp){
    resp.send('Succesfuly logged in');
});
app.get('/error',function(req,resp){
    resp.send('Error Loging in');
});
http.createServer(app).listen(app.get('port'), function(){
  console.log('Express server listening on port ' + app.get('port'));
});
4

1 回答 1

0

您没有done在成功处理程序中调用回调:

passport.use(new GoogleStrategy({
  returnURL: 'http://floating-citadel-4714.herokuapp.com/auth/google/return',
  realm: 'http://floating-citadel-4714.herokuapp.com'
  },
  function(identifier, profile, done){
    console.log('Success');
    console.log(identifier);
    console.log(profile);
    done(null, profile); // <-- important!
  }
));

如果您不这样做,Passport 将不会知道您已完成,结果将是您的请求将停止并(最终)超时。

我怀疑会出现日志消息,所以这可能只能解决您的部分问题。

(PS:查看文档,您似乎正在使用的基于 OpenID 的 Google 身份验证器只会将两个参数传递给回调;令人困惑的是,示例代码表明您的代码应该可以工作)

于 2013-10-14T06:15:10.047 回答