0

Node.js アプリケーションで Google 認証を行うためにPassportを使用しています。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 は処理が完了したことを認識できず、その結果、要求が停止し、(最終的に) タイムアウトになります。

ただし、ログメッセージが発生すると思われるため、これは問題の一部しか解決しない可能性があります.

(追記:ドキュメントを見ると、あなたが使用していると思われる OpenID ベースの Google 認証システムは、コールバックに 2 つの引数のみを渡します。紛らわしいことに、サンプル コードは、コードが機能することを示唆していますが)

于 2013-10-14T06:15:10.047 に答える