javascript - PassportJS 重定向循环

标签 javascript node.js coffeescript passport.js restify

下面是我的代码

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 选项。您需要像这样手动设置 header 和状态:

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/

相关文章:

javascript - 如何在运行 Mongodb 的 Mongoose 中执行脚本?

javascript - 无法在 node.js 中发送 Javascript 对象数组

arrays - 如何请求 JSON API

jquery - jQuery/Coffee 脚本中的数据属性

javascript - Javascript 中高效的人类可读日期字符串排序算法

javascript - 在 ionic 中使用 OneSignal 插件在通知单击时路由到应用程序中的状态

javascript - API YouTube - 在 YouTube 播放列表中添加多个视频

javascript - Coffeescript-Javascript 关联

selenium - 无法在 Protractor 和 CoffeeScript 中访问 WebDriverJS 等待 'until'

javascript - 嵌套对象迭代并返回空值键名nodejs