2013-12-17 61 views
2

下面是我的代碼有PassportJS重定向循環

restify = require("restify") 
passport = require("passport") 
GoogleStrategy = require("passport-google").Strategy 

jsonContentType = (req, res, next) -> 
    res.setHeader("content-type", "application/json") 
    next(req, res, next) 

server = restify.createServer(
    name: "Sparked API" 
) 

passport.use(new GoogleStrategy({ 
    returnURL: "http://localhost:8080/auth/google/return" 
    realm: "http://localhost:8080/" 
}, (id, profile, done) -> 
    done() 
)) 

server.use(jsonContentType) 

server.get("/", (req, res, next) -> 
    res.send(
     message: "hello world!" 
    ) 
) 

server.get("/auth/google", passport.authenticate("google")) 

server.get("/auth/google/return", passport.authenticate("google", { 
    successRedirect: "/" 
    failureRedirect: "/" 
})) 

server.listen(8080, -> console.log("restify listening on 8080")) 

看來我得到一個重定向循環,甚至一個非常削減版本

server.get("/auth/google/return", passport.authenticate("google", { 
    successRedirect: "/" 
    failureRedirect: "/" 
})) 

/是未經驗證的URL,這是怎麼造成一個重定向循環?我也嘗試添加在

server.use(passport.initialize()) 
server.use(passport.session()) 

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

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

但無濟於事

回答

4

您重定向循環正在發生的事情,因爲護照不能解析的OpenID響應,其中包括了許多查詢參數的。 Restify有一個bundled query parser你可以使用。

server.use restify.queryParser() 

儘管restify與express相似,但它並不具備所有API護照期望。主要一個是res.redirect其中is usedfailureRedirectsuccessRedirect選項。你需要手動設置頁眉和狀態,像這樣:

server.get "/auth/google/return", passport.authenticate("google"), 
    (req, res, next) -> 
     res.header 'Location', '/' 
     res.send 302 # redirect status 

有了這兩個加法,我能得到它在本地(gist

+0

工作有[連接重定向(HTTPS:/ /github.com/jaredhanson/connect-redirection),它將'redirect'函數添加到'res'。我認爲這應該與restify一起工作。 –

+0

謝謝。我會在這裏添加一個錯誤,服務器返回給我,以幫助人們更容易地在谷歌找到這個解決方案:''對象HTTP/1.1 500內部服務器錯誤內容類型:application/json沒有方法'重定向' –