2013-03-26 88 views
2

我使用下面的代碼與護照JS用戶登錄頁面刷新後不工作的護照JS

/** 
* Module dependencies. 
*/ 

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

var app = express(); 

var config = require('./config'); 

var User = require('./models/user'); 

var passport = require('passport'), 
    FacebookStrategy = require('passport-facebook').Strategy; 

//setting up passport 
passport.serializeUser(function(user, done){ 
    done(null, user.id); 
}); 

passport.deserializeUser(function(id, done){ 
    User.findById(id, function(err, user){ 
     done(err, user); 
    }); 
}); 


passport.use(new FacebookStrategy({ 
     clientID: config.development.fb.appid, 
     clientSecret: config.development.fb.appSecret, 
     callbackURL: config.development.fb.url + 'fbauthed' 
    }, 

    function (accessToken, refreshToken, profile, done) { 
     User.findOne({ 
      'fbId': profile.id 
     }, function (err, oldUser) { 
      if (oldUser) { 
       console.log('Existing user: ' + oldUser.name + ' found and logged in'); 
       done(null, oldUser); 
      } else { 
       var newUser = new User(); 
       newUser.fbId = profile.id; 
       newUser.name = profile.displayName; 
       newUser.email = profile.emails[0].value; 
       newUser.username = profile.username; 
       console.log(profile); 

       newUser.save(function (err) { 
        if (err) throw err; 
        console.log('New user:' + newUser.name + 'created and logged in'); 
        done(null, newUser); 
       }); 
      } 
     }); 
    } 

)); 


app.configure(function(){ 
    app.set('port', process.env.PORT || 5000); 
    app.set('views', __dirname + '/views'); 
    app.set('view engine', 'jade'); 
    app.use(express.favicon()); 
    app.use(express.logger('dev')); 
    app.use(express.cookieParser()); 
    app.use(express.session({secret: 'big secret'})); 
    app.use(passport.initialize()); 
    app.use(passport.session()); 
    app.use(express.bodyParser()); 
    app.use(express.methodOverride()); 
    app.use(app.router); 
    app.use(express.static(path.join(__dirname, 'public'))); 
}); 

app.configure('development', function(){ 
    app.use(express.errorHandler()); 
}); 

app.get('/', routes.index); 
app.get('/fbauth', passport.authenticate('facebook', {scope: 'email'})); 
app.get('/fbauthed', passport.authenticate('facebook',{ failureRedirect: '/'}), routes.loggedin); 

app.get('/logout', function(req,res){ 
    req.logOut(); 
    res.redirect('/'); 
}); 
//app.get('/users', user.list); 

http.createServer(app).listen(app.get('port'), function(){ 
    console.log("Express server listening on port " + app.get('port')); 
}); 

上面的代碼工作的偉大的,當用戶進行身份驗證的用戶進行身份驗證,但是身份驗證後刷新頁面拋出像下面的錯誤。

Express 
500 failed to obtain access token (status: 400 data: {"error":{"message":"This authorization code has been used.","type":"OAuthException","code":100}}) 
at /home/colm/javascript/facebookauth/node_modules/passport-facebook/node_modules/passport-oauth/lib/passport-oauth/strategies/oauth2.js:125:38 
at exports.OAuth2.getOAuthAccessToken (/home/colm/javascript/facebookauth/node_modules/passport-facebook/node_modules/passport-oauth/node_modules/oauth/lib/oauth2.js:131:18) 
at passBackControl (/home/colm/javascript/facebookauth/node_modules/passport-facebook/node_modules/passport-oauth/node_modules/oauth/lib/oauth2.js:77:9) 
at IncomingMessage.exports.OAuth2._request.request.on.callbackCalled (/home/colm/javascript/facebookauth/node_modules/passport-facebook/node_modules/passport-oauth/node_modules/oauth/lib/oauth2.js:94:7) 
at IncomingMessage.EventEmitter.emit (events.js:126:20) 
at IncomingMessage._emitEnd (http.js:366:10) 
at HTTPParser.parserOnMessageComplete [as onMessageComplete] (http.js:149:23) 
at CleartextStream.socketOnData [as ondata] (http.js:1447:20) 
at CleartextStream.CryptoStream._push (tls.js:544:27) 
at SecurePair.cycle (tls.js:898:20) 

這是什麼原因造成的?我該如何解決這個問題? 任何幫助將是偉大的。謝謝。

+0

錯誤信息_tells_你是什麼原因... – CBroe 2013-03-26 14:20:21

+0

CBroe或許我應該在下次更仔細閱讀它們! – redmansal 2013-03-26 14:43:55

回答

2

用於處理FB回調的路由只應發出重定向(如果身份驗證失敗,則返回登錄頁面,或者身份驗證成功時返回「登錄」頁面)。

你打電話routes.loggedin來處理該路由(在成功的情況下):

app.get('/fbauthed', passport.authenticate('facebook',{ failureRedirect: '/'}), routes.loggedin); 

這將繼續通過FB中造成「這個授權碼的網址傳遞的所有令牌已經使用' 信息。

那麼試試這個:

app.get('/loggedin', ensureLoggedIn('/'), routes.loggedin); // see below 
app.get('/fbauthed', passport.authenticate('facebook',{ 
    failureRedirect: '/', 
    successRedirect: '/loggedin' 
})); 

ensureLoggedIn是一箇中間件,如果用戶登錄,將檢查,如果沒有,會重定向到/(或任何URL你喜歡)。

+0

謝謝robertklep。已經對它進行了排序。 – redmansal 2013-03-26 14:42:03