护照“Hello World”总是失败

Passport "Hello World" always fails

提问人:Madara's Ghost 提问时间:5/9/2015 最后编辑:Madara's Ghost 更新时间:5/9/2015 访问量:733

问:

我有以下几点:

import {Router} from 'express';
import passport from 'passport';
import {Strategy} from 'passport-local';
import pg from 'pg';
import {pgUri} from '../environment';

let loginRouter = Router();

passport.use(new Strategy((username, password, done) => done(null, true)));
//{
//    pg.connectAsync(pgUri)
//        .then(([client, release]) => {
//            return client.queryAsync('select * from users where "user" = $1::TEXT', [username])
//                .finally(release);
//        })
//        .tap(result => console.log(result.rows))
//        .then(result => done(null, true));
//}));

loginRouter.get('/', (request, response) => response.render('login'));
loginRouter.post('/', passport.authenticate('local', {successRedirect: '/',
                                                      failureRedirect: '/login'}));

export default loginRouter;

它是一个快速路由文件,用于定义最简单的身份验证方案。上述内容始终重定向回 ,表示失败。/login

我试过什么

  • 更改为真正重定向到那里。所以登录确实失败了。failureRedirect/loginFailed
  • 函数体内的断点和 s 不会被命中。console.log
  • 用代替 true 调用不会改变任何事情。donedone(null, {foo: "bar"})

值得一提的是

  • 我正在使用 babel 来支持 ES6,但由于这是唯一失败的部分,并且我可以设置的断点(之前)显示所有变量的预期值,我认为这不是问题所在。passport.use
  • 路由按预期工作,并显示窗体。.get()

我在引导阶段有这个:

app.use(session({
    secret: "some-secret",
    resave: true,
    saveUninitialized: true
}));

app.use(passport.initialize());
app.use(passport.session());

passport.serializeUser((user, done) => done(null, {foo: "bar"}));

passport.deserializeUser((user, done) => done(null, {foo: "bar"}));

这是我使用的表格(直接从护照示例中复制而来))

<form action="/login" method="post">
    <div>
        <label>Username:</label>
        <input type="text" name="username"/>
    </div>
    <div>
        <label>Password:</label>
        <input type="password" name="password"/>
    </div>
    <div>
        <input type="submit" value="Log In"/>
    </div>
</form>

我不知道这里出了什么问题。将不胜感激任何帮助。

JavaScript Express Passport.js Passport-Local

评论

0赞 Rob Johansen 5/9/2015
你的护照代码在我看来没问题。您是否正在使用任何东西来解析 POST 正文?请参阅本页的“中间件”部分,并在此处查看该模块。body-parser
0赞 Madara's Ghost 5/9/2015
是的。这似乎是问题所在。很遗憾,这些事情没有得到更好的记录。如果你愿意写这个作为答案,我会投赞成票/接受。

答:

4赞 Rob Johansen 5/9/2015 #1

您需要使用一些东西来解析 POST 正文。

Passport 旨在从字面上做一件事:验证请求。它将所有其他功能(包括解析 POST 正文)委托给应用程序。他们在概述中这样说,但很容易低估其影响。

他们回到其配置页面的中间件部分中的主题,因此我建议阅读该主题。

我碰巧使用该模块来处理这个问题(在这里阅读)。body-parser

评论

0赞 Madara's Ghost 5/9/2015
他们在代码中提到了它,但他们没有在任何地方引用这一事实。希望这将对寻找它的人有所帮助。谢谢!