使用passport的Node.js用户身份验证

8

(使用序列化功能更新的代码-仍然重定向到/failedRedirect)

我试图使用passport包进行简单的用户名/密码身份验证,但失败了。 在下面的示例中,我尝试验证身份验证是否有效,方法是始终返回有效的身份验证(无论传递什么),但出于某种原因它失败了,并且passport重定向到登录失败的链接。

如果有人可以帮助我弄清楚如何使此示例仅身份验证任何内容,我应该能够从那里管理。

coffeescript 中的代码:

express = require "express"
passport = require "passport"
LocalStrategy = require("passport-local").Strategy

passport.use(new LocalStrategy( (username, password, done) ->
  console.log "LocalStrategy invoked"
  done(null, {id: 1, name: "Marius"})
))

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

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

app = express.createServer()

app.configure ->
  app.use express.bodyParser()
  app.use express.static("./public")
  app.use express.cookieParser("SOMESECRET")
  app.use express.session
    secret: "SOMESECRET"
    cookie:
      maxAge: 60000
  app.use passport.initialize()
  app.use passport.session()
  app.set "view", "./srv/views"
  app.set "view engine", "jade"

app.get "/login", (req, res) ->
  res.send "login page"

app.post "/login", passport.authenticate("local",
  failureRedirect: "/failedRedirect"
  successRedirect: "/successRedirect"
  failureFlash: true)

app.listen 8082
已解决: 好的,我相信有几个原因导致我不能让它正常工作。序列化可能是其中之一(我还没有测试过),但由于Jared说他们是必需的,我会留下它们(他是Passport的作者)。另一个混淆可能与express版本以及我的npm混淆有关。我相信我测试了最新的v2和v3版本的express,但现在我正在运行v3,对于版本三,您可能还应该在Github上查看connect-flash模块,因为在Jared的示例中使用的一些“flash”内容已从express v3中移出(因此该模块将其放回...)。最后,请确保使用正确命名的输入名称进行发布(默认情况下为usernamepassword)。
3个回答

12

我觉得你缺少必要的用户序列化逻辑来建立登录会话。如果我在JavaScript代码中添加这两个函数,它就可以正常工作:

passport.serializeUser(function(user, done) {
  done(null, user);
});

passport.deserializeUser(function(obj, done) {
  done(null, obj);
});

您需要根据自己的需求对用户进行序列化。 详细信息请参见此页面底部:http://passportjs.org/guide/configuration.html


已更新问题中的代码以包括序列化函数,但在我的端口身份验证仍然失败。您的端口是否成功进行了身份验证?谢谢。 - Marius Kjeldahl
是的,它确实会。你的代码是否打印出“LocalStrategy invoked”消息?将app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));挂载上去可能有所帮助,看看是否抛出任何异常。 - Jared Hanson
在我的端上,甚至连“invoked”消息也没有显示。我会尝试使用你的错误处理器来查看是否有任何提示。 - Marius Kjeldahl
什么也没有弹出。由于您已经确认在您这边运行正常,那么问题可能是我这边的某个版本不匹配(根据npm上我运行的所有内容都是最新的)。非常烦人,甚至没有错误消息,一片死寂。哦,好吧..如果我解决了,我会回复的。谢谢你的尝试。 - Marius Kjeldahl

10

对于使用本地密码策略遇到麻烦的人来说,POST变量名称往往是最大的坑。文档中应该突出强调它们,并提供配置值以进行更改。


现在看起来有配置值可以更改它们。请查看此页面底部:http://passportjs.org/guide/username-password/ - Marshall Thompson
是的,这个问题让我困扰了两天。 - darethas

1
我已经成功地从这个链接完成了操作: http://danialk.github.io/blog/2013/02/23/authentication-using-passportjs/ 并从https://github.com/DanialK/PassportJS-Authentication位置下载了示例代码。
在routes.js中只需要进行一个更改,更改代码即可。
app.post("/login" ,passport.authenticate('local',{successRedirect : "/",failureRedirect : "/login",  }));

要 ------------------------------

app.post("/login" ,passport.authenticate('local',{failureRedirect : "/login"}), function(req,res){ res.render('your home page here', {user : req.user });});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接