2013-03-26 3 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

+0

CBroe 아마도 다음에 더 자세히 읽어야합니다! – redmansal

답변

2

FB 콜백을 처리하는 데 사용되는 경로는 리디렉션 (인증에 실패하면 로그인 페이지로 돌아가거나 인증이 성공하면 '로그인 한 페이지)으로 만 리디렉션되어야합니다. 당신은 (성공의 경우) 그 경로를 처리 할 수 ​​routes.loggedin를 호출하고

는 :

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

이것은 '이 인증 코드의 결과로 URL에 FB에 의해 전달되는 모든 토큰을 유지합니다 사용되어왔다 ' 메시지.

그래서이 시도 :

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

ensureLoggedIn는 사용자가 로그인되어 있는지 확인하는 미들웨어이며, 그렇지 않은 경우 / (또는 무엇이든 URL 당신이 좋아)로 리디렉션됩니다.

+0

고마운 robertklep. 그것은 그것을 분류했다. – redmansal