下面是我的代码

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);
)

但无济于事

最佳答案

由于 Passport 无法解析包含许多查询参数的OpenId响应,因此发生了重定向循环。 Restify有一个bundled query parser可以使用。

server.use restify.queryParser()

尽管restify与express类似,但它并没有 Passport 所期望的所有API。一个主要的类型是res.redirect,其中is used用于failureRedirectsuccessRedirect选项。您需要像这样手动设置标题和状态:
server.get "/auth/google/return", passport.authenticate("google"),
    (req, res, next) ->
        res.header 'Location', '/'
        res.send 302 # redirect status

加上这两个功能,我就可以使其在本地工作(gist)

关于javascript - PassportJS重定向循环,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20631996/

10-09 08:11