2015-09-16 53 views
3

經過幾個小時試圖自己解決這個問題後,我到達SO社區尋找一些光。Passport身份驗證回調掛起

我正在使用護照進行用戶驗證。它已經初始化,在我的主要express.js文件按照文檔:

app.use(passport.initialize()); 

我得到它以這種方式處理一個facebook-passport文件index.js: Index.js

'use strict'; 

import express from 'express'; 
import passport from 'passport'; 
import auth from '../auth.service'; 
let router = express.Router(); 

//this function is defined in the auth.service import but copied it here in case it's needed (the `signToken` is also defined in the service) 
function setTokenCookie(req, res) { 
    if (!req.user) return res.json(404, { message: 'Something went wrong, please try again.'}); 
    var token = signToken(req.user._id, req.user.role); 
    res.cookie('token', JSON.stringify(token)); 
    res.redirect('/'); 
} 


router 
    .get('/', passport.authenticate('facebook', { 
    scope: ['email', 'user_about_me'], 
    failureRedirect: '/login' 
    })) 

.get('/callback', passport.authenticate('facebook', { 
    successRedirect: '/', 
    failureRedirect: '/login' 
}), setTokenCookie); 

module.exports = router; 

而且護照多數民衆贊成被導入在index.js這樣的.js:

passport.js

import passport from 'passport'; 
import { 
    Strategy as FacebookStrategy 
} 
from 'passport-facebook'; 

exports.setup = function(User, config) { 
    passport.use(new FacebookStrategy({ 
     clientID: config.facebook.clientID, 
     clientSecret: config.facebook.clientSecret, 
     callbackURL: config.facebook.callbackURL 
    }, 
    function(accessToken, refreshToken, profile, done) { 
     User.findOne({ 
     'facebook.id': profile.id 
     }, (findErr, user) => { 
     if (findErr) { 
      return done(findErr); 
     } 
     if (!user) { 
      let userToSave = new User({ 
      name: profile.displayName, 
      email: profile.emails[0].value, 
      role: 'user', 
      username: profile.username, 
      provider: 'facebook', 
      facebook: profile._json 
      }); 
      userToSave.save((saveErr) => { 
      if (saveErr) done(saveErr); 
      return done(null, user); 
      }); 
     } else { 
      return done(null, user); 
     } 
     }); 
    } 
)); 
}; 

這是目前發生的情況:

  • Facebook登錄提示
  • 在Facebook的成功認證回調(/ auth /中的Facebook /回調)與用戶信息達到和令牌預期後。

    • 節省了用戶之後,done(null,user)什麼都不做:
    • 用戶與所需字段

    事情變得怪異保存在數據庫中。該應用掛在回調上,客戶端一直在等待響應。

  • 中間件setTokenCookie永遠不會被調用,所以問題肯定在上一步。

我已經試過什麼:

  • 結束語從passport.js整個設置功能在process.tick(發現有些人使用它,但並沒有解決問題)
  • 使用與貓鼬承諾在User.findOne({...}).exec().then(user => {...})

如果您需要更多的信息,請不要猶豫,問。任何幫助真的很感激。

謝謝!

+0

您打電話給了mongoose.connect()嗎? –

+0

是的:)。關於Mongoose的一切,按預期工作,用戶可以是從數據庫保存或從數據庫中獲取的,但是在完成這兩種情況下(空,用戶)被掛起。 – Daniel

+0

你怎麼確定setTokenCookie沒有執行?你到處都只有console.logs嗎? –

回答

0

我看到一些可能丟失的部分,看着我的代碼。您是否使用passport.session()中間件?還有serializeUserdeserializeUser的功能?

passport.serializeUser(function(user, done) { 
    //place user's id in cookie 
    done(null, user.id); 
}); 

passport.deserializeUser(function(id, done) { 
    //retrieve user from database by id 
    User.findById(id, function(err, user) { 
    done(err, user); 
    }); 
}); 
+0

你好@cody。是的,我嘗試過使用'passport.session()'並且刪除它並在Passport策略中加入'{session:false}'選項。關於這些函數,它們是否被調用?它們是否有必要? – Daniel

+0

''serializeUser'將在用戶通過Facebook成功登錄後調用,以使cookie中的user.id可用於後續請求。deserializeUser用於這些後續請求以允許您檢索用戶我相信你想在你的場景中用'passport.session()'中間件來使用它們,我非常確定passport期望它們被用於除了你發送憑證的服務之外的所有事情通常是API)。 –

相關問題