2012-10-01 57 views
2

我正在使用護照,允許通過我的網站上的Facebook登錄。一切似乎都可以正常工作,但即使我使用有效令牌從Facebook返回所有數據,Facebook網站的回調也會始終轉到failureRedirect。任何想法爲什麼發生這種情況?nodejs護照始終失敗URL

express = require "express" 
passport = require 'passport' 
FBStrategy = require('passport-facebook').Strategy 
Properties = require "./config.json" 

FB_APP_ID = REMOVED 
FB_APP_SECRET = REMOVED 

passport.serializeUser = (user, done) -> 
done null, user 

passport.deserializeUser = (obj, done) -> 
    done null, obj 

fb = new FBStrategy 
    clientID: FB_APP_ID 
    clientSecret: FB_APP_SECRET 
    callbackURL: "http://localhost/auth/facebook/callback" 
    (accessToken, refreshToken, profile, done) -> 
    console.log "accesToken ", accessToken 
    console.log "refreshToken", refreshToken 
    console.log "profile", profile 
    done() 

passport.use fb 

app = module.exports = express.createServer() 
app.Properties = Properties 

console.log "starting server" 
app.configure -> 
    app.set "views", "./views" 
    app.set "view engine", "jade" 
    app.set "view options", layout: false 
    app.use express.methodOverride() 
    app.use (express.static "#{__dirname}") 
    app.use express.cookieParser() 
    app.use express.bodyParser() 
    app.use (express.session secret: REMOVED, key: REMOVED) 
    app.use passport.initialize() 
    app.use passport.session() 
    app.use app.router 

app.configure "development", -> 
    app.listen Properties.Port 


app.get "/", (request, response) -> 
    { session: Session } = request 
    response.render "index" 

app.get "/account", (request, response) -> 
    { session: Session } = request 
    response.render "account" 

app.get "/login", (request, response) -> 
    { session: Session } = request 
    response.render "login", {user:request.user} 

app.get "/auth/facebook", passport.authenticate 'facebook' 

app.get "/auth/facebook/callback", passport.authenticate ('facebook', {failureRedirect: "/login"}), (req, res) -> 
    res.redirect "/account" 


console.log "server is ready and listening on port #{Properties.Port}" 

回答

3

您需要在策略的驗證回調中提供用戶。事情是這樣的:

fb = new FBStrategy 
    clientID: FB_APP_ID 
    clientSecret: FB_APP_SECRET 
    callbackURL: "http://localhost/auth/facebook/callback" 
    (accessToken, refreshToken, profile, done) -> 
    console.log "accesToken ", accessToken 
    console.log "refreshToken", refreshToken 
    console.log "profile", profile 
    user = {} // find or create a user in your database 
    done(null, user) 

你可以閱讀更多有關指南中驗證回調:http://passportjs.org/guide/configuration.html

+0

謝謝!這解決了我的問題。我想在調用done()之後我需要做用戶的東西。 – koruptpaintbaler

+0

傳遞'done(null,0)'爲我工作。但傳遞'{}'給出了這個錯誤:「500錯誤:未能序列化用戶進入會話」 – vsync

+0

我會檢查你是'serializeUser'函數。它可能會拋出一個異常。 –